字节数组的前3个字节只是整数,有没有更好的方法来转换它们?到目前为止,我有这个,但这只是一种糟糕的做法。
public int parse_code(byte[] bs) {
char[] array = new char[3];
for(int i = 0; i < 3; i++) {
array[i] = (char) bs[i];
}
// Dirty way of doing it
return Integer.parseInt(new String(array));
}
答案 0 :(得分:3)
如果您知道在字节数组的开头总会有3个十进制数字,您可以直接将它们转换为整数:
public int parse_code( byte[] bs )
{
int intval = 0;
for( int i = 0; i < 3; i++ )
intval = intval * 10 + ( bs[ i ] - '0' );
return intval;
}
答案 1 :(得分:2)
您的示例代码似乎将byte
与其ASCII值相关联。正确的方法是使用带有String
数组和字符集的byte
构造函数:
// note: throws charset exception that will never be thrown on a valid JVM
// as all JVMs must support US-ASCII
Integer.parseInt(new String(byteArray, "US-ASCII"));
注意:如果byte
不是表示整数的ASCII字符值(例如,它只是int
编码为四个byte
s,那么你想看看ByteBuffer
课程。它具有可以从ByteBuffer
转换为其他缓冲区(例如IntBuffer
)的帮助程序,以启用简单的允许循环(如果它是所有类型)(而不是混合消息,例如传入的C结构)或者其他的东西)。它还具有更改的启用字节顺序的优势。
int bytesValue = ByteBuffer.wrap(byteArray).getInt();
正如x4u所指出的那样,值得注意的是ByteBuffer
确实需要为每个值获得适当数量的byte
s。因此,如果有[0,3],上面的getInt()
方法将使用接下来的4 byte
并失败(有例外)。
答案 2 :(得分:1)
如果要将其转换为int,则数组的大小应为max 4,int不应超过214783647.然后:
int i = (bs[3] << 24) + (bs[2] << 16) + (bs[1] << 8) + bs[0] ;
您必须知道的其他事项:字节数组中哪个位置适合int(big-endian vs little-endian):
(而不是前面的表达式)也许你需要:
int i = (bs[0] << 24) + (bs[1] << 16) + (bs[2] << 8) + bs[3] ;
如果不是全部4个字节,则必须检查长度。
答案 3 :(得分:0)
看起来您正在尝试将123
的三个字节的ASCII [49, 50, 51]
转换为123。
public static long parse_code(byte... bs) {
long value = 0;
for(byte b: bs)
value = value * 10 + b - '0';
return value;
}
如果你知道它总是3个字节。
public static int parse_code(byte... bs) {
return bs[0]*100 + bs[1]*10 + bs[2] - '0' * 111;
}