有人能给我解释一下下面的Java代码在做什么吗?
我知道您正在尝试将字节转换为十六进制字符串。我不明白是怎么做到的。例如,如果s[i]为00000001(十进制1),您能否解释:有人能给我解释一下下面的Java代码在做什么吗?,java,binary,hex,bit-manipulation,Java,Binary,Hex,Bit Manipulation,我知道您正在尝试将字节转换为十六进制字符串。我不明白是怎么做到的。例如,如果s[i]为00000001(十进制1),您能否解释: 为什么0x000000ff&00000001?为什么不直接使用00000001呢 为什么由#1 | 0xFFFF00产生 最后,为什么要应用子字符串(6) 谢谢。这基本上是因为字节是用Java签名的。如果将一个字节提升为int,它将符号扩展,这意味着字节0xf2将变为0xfffff2。符号扩展是一种方法,通过将最高有效位(符号)复制到所有高阶位,在加宽值时保持值不变。
谢谢。这基本上是因为字节是用Java签名的。如果将一个字节提升为int,它将符号扩展,这意味着字节
0xf2
将变为0xfffff2
。符号扩展是一种方法,通过将最高有效位(符号)复制到所有高阶位,在加宽值时保持值不变。上述两个值都是用二的补码表示法表示的-14
。相反,如果您将0xf2
扩展到0x000000f2
,它将是242
,可能不是您想要的
因此,和
操作是去掉这些扩展位中的任何一位,只留下最低有效的8位。然而,由于在下一步中您将强制这些位为1,因此这一步似乎有点浪费
接下来的
操作将强制所有的高位为1,这样您就可以保证从ffffff00
到ffffffff
获得一个8字符的字符串(因为tohextstring
不会给您前导零,所以它会将7
转换为“7”
而不是您想要的“07”
)
然后应用子字符串(6)
,以便只获得这八个十六进制数字中的最后两个
当您只需使用string.format(“%02x”,s[i])
时,这似乎是一种非常复杂的方法,可以确保您获得一个两个字符的十六进制字符串。然而,当引入String.format
时,这个特定的代码片段可能早于Java5
如果运行以下程序:
byte s[] = getByteArray()
for(.....)
Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
公共类testprog{
公共静态无效比较(字符串s1、字符串s2){
如果(!s1.等于(s2))
System.out.println(“不同:+s1+”+s2);
}
公共静态void main(字符串参数[]){
字节b=-128;
而(b<127){
比较(
整数.toHexString((0x000000ff&b)| 0xffffff00)。子字符串(6),
格式(“%02x”,b,args));
b++;
}
比较(
整数.toHexString((0x000000ff&b)| 0xffffff00)。子字符串(6),
格式(“%02x”,b,args));
System.out.println(“完成”);
}
}
您将看到这两个表达式是相同的-它只是吐出
Done
,因为这两个表达式在所有情况下都会产生相同的结果。似乎您可以删除“| 0xffff00).子字符串(6)`位,而不改变任何功能。不完全如此,@Cameron,这将为范围0..15提供一个1个字符的字符串-问题中的代码总是提供两个字符。啊,是的,toHexString不填充。Formatter.format可能是更好的方法。
public class testprog {
public static void compare (String s1, String s2) {
if (!s1.equals(s2))
System.out.println ("Different: " + s1 + " " + s2);
}
public static void main(String args[]) {
byte b = -128;
while (b < 127) {
compare (
Integer.toHexString((0x000000ff & b) | 0xffffff00).substring(6),
String.format("%02x", b, args));
b++;
}
compare (
Integer.toHexString((0x000000ff & b) | 0xffffff00).substring(6),
String.format("%02x", b, args));
System.out.println ("Done");
}
}