Encoding 从长到基64个字符的数字

Encoding 从长到基64个字符的数字,encoding,character-encoding,base64,Encoding,Character Encoding,Base64,我正在做一个小任务,它需要一些base64编码。我试图在头脑里做这件事,但却迷路了 我有一个java长格式的13位数字,比如:1294705313608、1294705313594、1294705313573 我对它进行了一些处理,基本上我将这个数字附加到一个字节数组中,然后使用以下命令将其转换为base64: String b64String = new sun.misc.BASE64Encoder().encodeBuffer(bArray); 现在,我知道,对于我原来的号码,前3位数字永

我正在做一个小任务,它需要一些base64编码。我试图在头脑里做这件事,但却迷路了

我有一个java长格式的13位数字,比如:1294705313608、1294705313594、1294705313573

我对它进行了一些处理,基本上我将这个数字附加到一个字节数组中,然后使用以下命令将其转换为base64:

String b64String = new sun.misc.BASE64Encoder().encodeBuffer(bArray);
现在,我知道,对于我原来的号码,前3位数字永远不会改变。所以129在上述数字中是常数。我想知道在生成的base64字符串中,与这些数字对应的字符有多少不会改变

将long序列化到字节数组的代码。我忽略前2个字节,因为它们始终为0:

bArray[0]=(字节)(时间>>>40)
bArray[1]=(字节)(时间>>>32)
bArray[2]=(字节)(时间>>>24)
bArray[3]=(字节)(时间>>>16)
bArray[4]=(字节)(时间>>>8)
bArray[5]=(字节)(时间>>>0)

谢谢

注: 我知道base64将占用6位并从中生成一个字符。所以,如果前3位的长度不变,那么base64中有多少个字符不变。
这不是一个硬件分配,但我不太熟悉编码。

1290000000000是二进制的
10010110001011001111111111110010000000000。
129999999999是二进制的
100101110101011100000100110001111000111111111


两者都有41位长,在前7位之后不同。移位将第41-48位放在第一个字节中,该字节始终为
00000001
。以下字节将始终为
00101110
00101101
00101110
。因此,在所有可能的数组值中,前导的14位是共同的,这(每个编码的base64字符6位)意味着编码字符串中有2个共同的字符。

看来您走对了方向。我认为您要做的是将long转换为字节数组,然后将字节数组转换为Base64


演示如何将其转换为字节。

我认为这是家庭作业,但没有标记为家庭作业。你能用其他“东西”将用于序列化long的代码发布到字节数组中吗?@dkarp:我已经发布了代码。Thnx dkarp,我混淆了“前7位之后的代码不同”&“在所有可能的数组值中,前导的14位是相同的" ... 7位可以组成一个3位数字,因此我可以理解长序列中的前3位不会改变……因此7位只能对应1个base64char。。所以只有1个字符不应该改变。。你能再解释一下你是如何推导出14位的吗。thnx再次..我对它进行了编程,正如你所看到的,long是timestmp..所以在两次不同的时间里,我得到了这些数字。nos是在实际字节数组追加更多字节后添加的,因此忽略其长度:使用序列化逻辑将这7位拆分。1位进入第一个字节,另6位进入第二个字节。第一个字节中的1位是所有
0
s的7位。因此,您的
long
中有7位不变,还有7位前导
0
。移位将第41-48位放在第一个字节中是正确的。。它将不是00000001。。它将是位41-48中的时间变量。这7位进入bArray[0]。。因此我说的是1 base64字符,时间变量在41-48位有
00000001
。位33-40中有
00101110
00101101
00101110
。您缺少的是序列化算法从长字符串中获取第一个非零位,以及前导
0
的7位。