简单的情况是:
您有一个字节数组
byte[] message = {1,2,3};
要以二进制形式打印出来,您可以使用以下代码:for (byte b : message) {
System.out.println(Integer.toBinaryString(0x100 + b).substring(1));
}
我从这个stackoverflow线程获取了这段代码。
然后得到以下输出:
00000001
00000010
00000011
但如果你在末尾标记-128...
byte[] message = { 1, 2, 3, -128 };
00000001
00000010
00000011
0000000
哇!一个七位的二进制数?我感觉这与二进制补码有关,但我越读就越困惑。我本来期望在第四行看到10000000
…
能有人简单地解释一下为什么-128
的Integer.toBinaryString
是七位吗?
旧版javadoc说如果该参数为负,则无符号整数值为该参数加上2^32;否则它等于该参数。将此值转换为二进制(基数为2)中的ASCII数字字符串时不需要额外前导0。
但就像我说的……让我更加困惑了。
整个事情的背景是我正在尝试使用java编写一些SHA函数。别问我为什么,我自己都不知道……我只是好奇/挑战自己/折磨自己 :)
根据文档,用于SHA-256函数对消息进行填充(使其成为512位的倍数)的方法是将以下内容串联起来:
- 原始消息
- 一个单一的
1
位 0
位,直到最后64位- 原始消息长度作为64位值
由于我的消息可能是ASCII 8位代码,所以我只需在#2中标记一个10000000
…然后我只需要计算要添加的0
字节数量,我不必为不是8的倍数的消息做规划。问题是如何制作10000000
。