【问题标题】:Is there a compact way to encode binary literal data in Java? [duplicate]是否有一种紧凑的方法可以在 Java 中编码二进制文字数据? [复制]
【发布时间】:2016-09-12 13:06:28
【问题描述】:

我可以在 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[]

【问题讨论】:

  • 您可以使用BigInteger 来避免自己编写帮助程序类。
  • “除了写一个帮助类...”我怀疑不是。
  • @malbarbo -- 不是那个问题的重复,它只是想知道如何解决由于缺少演员表而导致的问题。我知道在Java中创建字节数组字面量的默认方法需要强制转换,我想知道是否有一种方法可以更紧凑地表达字节数组。
  • 这个问题预先假定了上面链接问题的答案;在我看来不是骗子。不幸的是,我认为 OP 的问题(有没有更好的方法)的答案是“不”。

标签: java binary


【解决方案1】:

选择你的毒药。所有的选择都以某种方式痛苦。
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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2019-08-15
    • 2017-12-23
    • 2019-02-26
    • 2021-02-23
    • 2023-04-09
    • 2019-04-05
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多