将字节数组块转换为 DWORD (int) Java
convert byte array block to DWORD (int) Java
如何将 4 的字节数组块转换为整数。
如果我们在十六进制编辑器中有这些字节的文件:
CB 01 00 00
这个块的十六进制值为000001CB
的DWORD = 1CB
hex = 459
的十进制。
如何将任何字节数组 (byte[]
) 块(四个字节)转换为整数(块的十进制值)?
我正在寻找这样的方法:
public int getDecimalFromBlock( byte... bytes ) {
for ( byte b: bytes ) {
// do the magic
}
}
其中参数字节数在字节范围 (-127, 127) 之间。
假设您的字节顺序是 Little Endian(基于您的 post),因此解码将是
int value = ((data[0]&0xff) |
((data[1]&0xff)<<8) |
((data[2]&0xff)<<16) |
((data[3]&0xff)<<24));
如果顺序是 Big endian,它将类似于:
int value = ((data[3]&0xff) |
((data[2]&0xff)<<8) |
((data[1]&0xff)<<16) |
((data[0]&0xff)<<24));
在这两种情况下,变体 "data" 都是 "byte[]"
byte[] data = new byte[] {(byte)0xcb, 0x01, 0x00, 0x00};
更新到已编辑的请求。
我假设您可能会遇到将 0xcb 解释为负值的问题,这可以通过应用 &
运算符
来解决
带有测试用例的完整代码
public class DecimalTest
{
public static int getDecimalFromBlock( byte... bytes ) {
int result = 0;
for(int i=0; i<bytes.length; i++)
{
result = result | (bytes[i] & 0xff)<<(i*8);
}
return result;
}
public static void main(String[] args) throws IOException
{
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00, 0x00}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00, 0x00, 0x00}));
}
}
您还可以查看 Apache Commons IO 库及其 EndianUtils class。正是为了这个目的。
请注意,four-byte DWORD(无符号)只能正确映射到 Java(有符号)long
,作为 Java(有符号)int
不能包含 DWORD 的所有可能值(太大的值会导致负 int
值)。所以EndianUtils.readSwappedUnsignedInteger()
正确returns一个long
.
如何将 4 的字节数组块转换为整数。
如果我们在十六进制编辑器中有这些字节的文件:
CB 01 00 00
这个块的十六进制值为000001CB
的DWORD = 1CB
hex = 459
的十进制。
如何将任何字节数组 (byte[]
) 块(四个字节)转换为整数(块的十进制值)?
我正在寻找这样的方法:
public int getDecimalFromBlock( byte... bytes ) {
for ( byte b: bytes ) {
// do the magic
}
}
其中参数字节数在字节范围 (-127, 127) 之间。
假设您的字节顺序是 Little Endian(基于您的 post),因此解码将是
int value = ((data[0]&0xff) |
((data[1]&0xff)<<8) |
((data[2]&0xff)<<16) |
((data[3]&0xff)<<24));
如果顺序是 Big endian,它将类似于:
int value = ((data[3]&0xff) |
((data[2]&0xff)<<8) |
((data[1]&0xff)<<16) |
((data[0]&0xff)<<24));
在这两种情况下,变体 "data" 都是 "byte[]"
byte[] data = new byte[] {(byte)0xcb, 0x01, 0x00, 0x00};
更新到已编辑的请求。
我假设您可能会遇到将 0xcb 解释为负值的问题,这可以通过应用 &
运算符
带有测试用例的完整代码
public class DecimalTest
{
public static int getDecimalFromBlock( byte... bytes ) {
int result = 0;
for(int i=0; i<bytes.length; i++)
{
result = result | (bytes[i] & 0xff)<<(i*8);
}
return result;
}
public static void main(String[] args) throws IOException
{
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00, 0x00}));
System.out.println(getDecimalFromBlock(new byte[]{(byte)0xcb, 0x01, 0x00, 0x00, 0x00}));
}
}
您还可以查看 Apache Commons IO 库及其 EndianUtils class。正是为了这个目的。
请注意,four-byte DWORD(无符号)只能正确映射到 Java(有符号)long
,作为 Java(有符号)int
不能包含 DWORD 的所有可能值(太大的值会导致负 int
值)。所以EndianUtils.readSwappedUnsignedInteger()
正确returns一个long
.