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

使用Java中的Scanner将十六进制有效值字符串转换为字节数组

  •  0
  • yageek  · 技术社区  · 6 年前

    我想将格式为“AA BB CC”或“0xAA 0xBB 0xCC”的字符串转换为字节数组。阅读的文档 Scanner 看起来很有希望。

    我以为 hasNextByte() getNextByte() 将执行此任务,但实际上似乎检测不到字节。代码非常简单:

    byte[] bytesFromString(String value) {
    
        List<Byte> list = new ArrayList<>();
        Scanner scan = new Scanner(value);
        while(scan.hasNextByte(16)) {
         list.add(scan.nextByte(16));
        }
    
        byte[] bytes = new byte[list.size()];
        for(int i = 0; i < list.size(); i++){
            bytes[i] = list.get(i);
        }
        return bytes;
    }
    

    我总是收到一个空数组作为输出: hasNextByte(16) 从不检测字节。

    有没有什么特别的原因说明它不起作用?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jorn Vernee    6 年前

    问题是你的价值观( AA BB CC )超出的范围 byte 自从 字节 已签名。

    一种可能的解决方法是将值读取为 short 然后将其转换为 字节 :

    while (scan.hasNextShort(16)) {
        list.add((byte) scan.nextShort(16));
    }
    

    打印结果时,您将看到值为负值:

    String input = "AA BB CC";
    byte[] result = bytesFromString(input);
    System.out.println(Arrays.toString(result)); // [-86, -69, -52]
    

    显示溢出。