私は独自のASN.1フレームワークを実装しています。最後のアイテムはASN.1 RealとしてJava Doubleをエンコードしています。最初のリンクは私のライブラリで、ASN.1 Realsの仕様へのリンクです。私の問題は、正しい仮数にアクセスするencodeDoubleValueです。助けて!エンコードjava double asn1 Real {sign、mantissa、base、exponent}
https://github.com/ZiroZimbarra/ASN1
レアルのための私のテストで
私のコードは次のようになります。
testRealBytes(new byte[] {9, 5, (byte) 0x80, (byte) 0xFE, (byte) 0x55, (byte) 0x55, (byte) 0x55}, 1398101.25);
はここに私の問題は、コードのthridラインでエンコーディングで発生する私のテスト実装、です。ここで
private void testRealBytes(byte[] bytes, Object testObj) throws IOException, InstantiationException, IllegalAccessException {
Object obj = (Double) ASN1InputStream.decode(bytes);
assertTrue(obj.equals(testObj));
byte[] newBytes = ASN1OutputStream.encodeObject(obj);
assertTrue(Arrays.equals(bytes, newBytes));
}
私encodeValue方法である:
public void encodeDoubleValue(Double doubleObj, ASN1OutputStream derStream) throws IOException {
if(doubleObj == 0) {return; }
if(doubleObj == Double.POSITIVE_INFINITY) { derStream.write(0x40); return; }
if(doubleObj == Double.NEGATIVE_INFINITY) { derStream.write(0x41); return; }
long bits = Double.doubleToLongBits(doubleObj);
long mantissa = (bits & 0x000fffffffffffffL);
int exponent = Integer.valueOf(Long.valueOf(((bits & 0x7FF0000000000000L) >> 52) - 1023).toString());
int base = 2;
byte signByte = (byte) (((bits & 0x8000000000000000L) > 1) ? 0x40 : 0x00);
ASN1OutputStream exponentStream = derStream.newStream();
new ASN1IntegerType().encodeValue(exponent, exponentStream);
byte[] exponentBytes = exponentStream.toByteArray();
switch(exponentBytes.length) {
case 1:
derStream.write(0x80 | (byte) signByte | 0x00);
break;
case 2:
derStream.write(0x80 | (byte) signByte | 0x01);
break;
case 3:
derStream.write(0x80 | (byte) signByte | 0x02);
break;
default:
derStream.write(0x80 | (byte) signByte | 0x03);
derStream.write(exponentBytes.length);
break;
}
derStream.write(exponentBytes);
byte[] leftBytes = Long.toUnsignedString(mantissa, 16).getBytes();
int length = leftBytes.length;
byte[] mantissaBytes = new byte[length];
for(int i = 0; i < length; i++) {
mantissaBytes[i] = leftBytes[length - i - 1];
}
for(byte b : mantissaBytes) {
derStream.write(b);
}
}
1398101.25ための結果は
[9, 15, -128, 20, 48, 48, 48, 48, 48, 48, 48, 52, 53, 53, 53, 53, 53]
の代わりに、何それはまた
[9, 5, -128, -2, 85, 85, 85]
を私は上のベース16への私の変更のために編集toUnsignedString(仮数、16)を呼び出します。 –
いくつかの具体的な質問をし、あなたが何をしているのかを説明するコメントを追加することをお勧めします。ここでDERの仕様をどのようにしているかは、私にはあまり明らかではありません。目立つもの - toUnsignedStringで何をやっていますか?私はなぜ仮数を文字列表現に変換しているのかわからないし、それらのキャラクタを取り、対応するバイトをエンコードしています。 – Kevin
あなたはベース2を使用してエンコードする必要があります。ベース10をやろうとしているかもしれません。私は考えていません。 – Kevin