将二进制文件中的 2 字节(unsigned short)转换为 Java short
Convert 2 byte (unsigned short) to Java short from binary file
我有带有未签名短裤的二进制文件。我需要从这个字节中获取无符号值到 JAVA 中的原始 short。字节顺序是 Little Endian。我这样尝试:
byte[] bytes = new byte[frameLength];
for(int i = 0; i < fh.nFrames; i++) {
raf.readFully(bytes);
for(int j = 2; j < frameLength/2; j++) {
short s;
s = (short) (bytes[2*j + 1] << 8 | bytes[2 * j]);
System.out.println(s);
System.out.println(Integer.toBinaryString(s));
}
}
示例:
情况 1(好的):
无符号短:8237
十六进制(小端):2D 20
二进制(大端):0010 0000 0010 1101
System.out.println(Integer.toBinaryString(s)) 给我们
10000000101101。正确。
案例 2(不行)
无符号短:384
十六进制(小端):80 01
二进制(大端):0000 0001 1000 0000
System.out.println(Integer.toBinaryString(s)) 给我们
11111111111111111111111110000000。
System.out.println(s) 给我们 -128。这是不正确的。
我如何从中获得 384 值?
有人知道为什么它不起作用吗?
Java 在进行整数计算之前将所有内容转换为 int,并且随着字节被签名,您将获得符号扩展。您必须强制字节保留在 [0; 255] 范围按位 and-ing 它们与 0xFF:
s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF));
我有带有未签名短裤的二进制文件。我需要从这个字节中获取无符号值到 JAVA 中的原始 short。字节顺序是 Little Endian。我这样尝试:
byte[] bytes = new byte[frameLength];
for(int i = 0; i < fh.nFrames; i++) {
raf.readFully(bytes);
for(int j = 2; j < frameLength/2; j++) {
short s;
s = (short) (bytes[2*j + 1] << 8 | bytes[2 * j]);
System.out.println(s);
System.out.println(Integer.toBinaryString(s));
}
}
示例: 情况 1(好的): 无符号短:8237 十六进制(小端):2D 20 二进制(大端):0010 0000 0010 1101 System.out.println(Integer.toBinaryString(s)) 给我们 10000000101101。正确。
案例 2(不行) 无符号短:384 十六进制(小端):80 01 二进制(大端):0000 0001 1000 0000 System.out.println(Integer.toBinaryString(s)) 给我们 11111111111111111111111110000000。 System.out.println(s) 给我们 -128。这是不正确的。 我如何从中获得 384 值?
有人知道为什么它不起作用吗?
Java 在进行整数计算之前将所有内容转换为 int,并且随着字节被签名,您将获得符号扩展。您必须强制字节保留在 [0; 255] 范围按位 and-ing 它们与 0xFF:
s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF));