代码之家  ›  专栏  ›  技术社区  ›  user_1357

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

  •  4
  • user_1357  · 技术社区  · 15 年前
    byte s[] = getByteArray()
    for(.....)
    Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
    

    我知道你想把字节转换成十六进制字符串。我不明白是怎么做到的。例如,如果s[i]是00000001(十进制1),请解释:

    1. 为什么是0x000000ff&00000001?为什么不直接使用00000001呢?
    2. 最后为什么应用子串(6)?

    1 回复  |  直到 15 年前
        1
  •  11
  •   paxdiablo    15 年前

    这主要是因为字节是用Java签名的。如果将一个字节提升为int,则它将标记extend,这意味着 0xf2 会变成 0xfffffff2 -14 在二的补码符号中。如果你反而变宽了 0xf2型 0x000000f2 ,可能是 242 ,可能 你想要什么。

    所以 &

    这个 | 接下来的操作将强制所有高位为1,这样您就可以从 ffffff00 ffffffff 包括(自 toHexString 7 进入之内 "7" 而不是 "07"

    这个 substring(6) 然后应用,以便只得到这八个十六进制数字中的最后两个。

    String.format ("%02x", s[i]) . 但是,这个特定的代码片段可能早于Java5 String.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");
        }
    }
    

    你会看到这两个表达式是一样的-它只是吐出来 Done