我可以用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[]
)
答案 0 :(得分:3)
选择你的毒药。所有的选择都以某种方式痛苦
It is lamentable that Java's byte
type is signed instead of unsigned
带有强制转换的十六进制字节常量。为了统一,你应该只是投射每一个元素。对于很短的列表,这是可以的。
byte[] b = {(byte)0x00, (byte)0x7F, (byte)0x80, (byte)0xFF};
有符号十进制字节常量,以避免强制转换。很少有工具可以轻松读取或写入这种格式。可能在实践中没用。
byte[] b = {0, 127, -128, -1};
通过辅助函数进行的内部到字节转换。它看起来整洁,有助于中等数量的数据。
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;
}
字符串到字节的转换。现在你每个字节只能使用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;
}
Base64编码的字符串。这比#4更紧凑,但需要编码工作。使用java.util.Base64(Java SE 8+)可以轻松解码。我有一个实际的例子,我stored a Base64 binary blob in my Java source code。