在Java中,我可以将
使用这段Python代码生成Base64编码字符串时,在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
,但乍一看它似乎可以做到我所需的。)
struct.pack
的二进制表示具有尾随的\x00
字符,这会产生额外的填充。这是否意味着我必须手动修剪额外的填充? - jbatista<<
方向错误。 - John La Rooyhex(16777472)
是0x1000100
,而hex(65537)
是0x10001
。这是否有助于你弄清楚发生了什么? - abarnert