有一种在Java中编码二进制文字数据的紧凑方法吗?

时间:2016-05-16 16:45:53

标签: java binary

我可以用Java做到这一点

final byte[] b = new byte[]{0x01, 0x02, 0x04, 0x08,
                            (byte)0x80, 0x40, 0x20, (byte)0xff,
                            (byte)0xef, 0x40, 0x30, (byte)0xfe,
                            0x3f, (byte)0x90, 0x44, 0x78};

而在Python 2.x中,我可以使用

b = '\x01\x02\x04\x08\x80\x40\x20\xff\xef\x40\x30\xfe\x3f\x90\x44\x78'

Java语法很痛苦,需要(byte)强制转换来处理最高位设置的值。

有更简单的方法吗? (除了编写帮助类以将"01020408804020ffef4030fe3f904478"之类的字符串转换为byte[]

1 个答案:

答案 0 :(得分:3)

选择你的毒药。所有的选择都以某种方式痛苦 It is lamentable that Java's byte type is signed instead of unsigned

  1. 带有强制转换的十六进制字节常量。为了统一,你应该只是投射每一个元素。对于很短的列表,这是可以的。

    byte[] b = {(byte)0x00, (byte)0x7F, (byte)0x80, (byte)0xFF};
    
  2. 有符号十进制字节常量,以避免强制转换。很少有工具可以轻松读取或写入这种格式。可能在实践中没用。

    byte[] b = {0, 127, -128, -1};
    
  3. 通过辅助函数进行的内部到字节转换。它看起来整洁,有助于中等数量的数据。

    byte[] b = toBytes(new int[]{0x00, 0x7F, 0x80, 0xFF});
    
    static byte[] toBytes(int[] x) {
        byte[] y = new byte[x.length];
        for (int i = 0; i < x.length; i++)
            y[i] = (byte)x[i];
        return y;
    }
    
  4. 字符串到字节的转换。现在你每个字节只能使用2个字符(没有逗号或0x),加上一定量的开销。

    byte[] b = hexToBytes("007F80FF");
    
    static byte[] hexToBytes(String s) {
        byte[] b = new byte[s.length() / 2];
        for (int i = 0; i < b.length; i++)
            b[i] = (byte)Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16);
        return b;
    }
    
  5. Base64编码的字符串。这比#4更紧凑,但需要编码工作。使用java.util.Base64(Java SE 8+)可以轻松解码。我有一个实际的例子,我stored a Base64 binary blob in my Java source code