Java では、次のようにエンコードできますBigInteger
。
java.math.BigInteger bi = new java.math.BigInteger("65537L");
String encoded = Base64.encodeBytes(bi.toByteArray(), Base64.ENCODE|Base64.DONT_GUNZIP);
// result: 65537L encodes as "AQAB" in Base64
byte[] decoded = Base64.decode(encoded, Base64.DECODE|Base64.DONT_GUNZIP);
java.math.BigInteger back = new java.math.BigInteger(decoded);
C# の場合:
System.Numerics.BigInteger bi = new System.Numerics.BigInteger("65537L");
string encoded = Convert.ToBase64(bi);
byte[] decoded = Convert.FromBase64String(encoded);
System.Numerics.BigInteger back = new System.Numerics.BigInteger(decoded);
Pythonで長い整数をBase64でエンコードされた文字列としてエンコードするにはどうすればよいですか? 私がこれまでに試したことは、他の言語での実装とは異なる結果をもたらします (これまで Java と C# で試してきました)。特に、Base64 でエンコードされたより長い文字列が生成されます。
import struct
encoded = struct.pack('I', (1<<16)+1).encode('base64')[:-1]
# produces a longer string, 'AQABAA==' instead of the expected 'AQAB'
この Python コードを使用して Base64 でエンコードされた文字列を生成すると、結果として Java でデコードされた整数 (たとえば)16777472
が、期待される の代わりに生成され65537
ます。まず、何が欠けていますか?
次に、で使用する長さの形式を手で把握する必要がありstruct.pack
ます。長い数値 (より大きい(1<<64)-1
) をエンコードしようとしている場合、'Q'
形式の仕様が短すぎて表現を保持できません。それは私が手作業で表現をしなければならないということですか、それとも関数の文書化されていない書式指定子がありstruct.pack
ますか? (私は強制的に を使用しているわけではありませんstruct
が、一見すると、必要なことを実行しているように見えました。)