有人能给我解释一下下面的Java代码在做什么吗?

有人能给我解释一下下面的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。符号扩展是一种方法,通过将最高有效位(符号)复制到所有高阶位,在加宽值时保持值不变。

我知道您正在尝试将字节转换为十六进制字符串。我不明白是怎么做到的。例如,如果s[i]为00000001(十进制1),您能否解释:

  • 为什么0x000000ff&00000001?为什么不直接使用00000001呢
  • 为什么由#1 | 0xFFFF00产生
  • 最后,为什么要应用子字符串(6)
    谢谢。

    这基本上是因为字节是用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");
        }
    }