2011-06-01 74 views
2

字节数组的前3个字节只是整数,有没有更好的方法来转换它们?到目前为止,我有这个,但它只是一种不好的做法。有没有更好的方法将字节数组转换为int?

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

它们是有符号还是无符号字节?在我们可以判断上述代码是否正确之前,这是一件重要的事情。 – JohnnyO 2011-06-01 18:06:11

+0

从上面的代码中,字节显然是ASCII数字。 – x4u 2011-06-01 18:12:15

回答

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; 
} 
2

您的代码示例似乎给byte s的他们的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并失败(有例外)。

+0

问题中的“字节”是数字字符,而不是二进制值。 – erickson 2011-06-01 18:15:15

+0

虽然这个建议对其他问题是正确的,但显然不适用于此。 ByteBuffers也不解析ASCII数字,也不能处理长度为3个字节的整数。 – x4u 2011-06-01 18:16:14

+0

@erickson已修改。@ x4u你是对的,但是我确实希望在那里保留那个位置,因为当人们从搜索中找到这个时(因为当他们想要'ByteBuffer'时标题会引导他们到这里)。 – pickypg 2011-06-01 18:18:38

1

如果你想它转换成int,则数组的大小应该是最多4和INT不超过214783647.然后:

你必须知道

int i = (bs[3] << 24) + (bs[2] << 16) + (bs[1] << 8) + bs[0] ;

其他的事情:这地方在INT(大端符合字节数组中的位置vs little-endian): (而不是以前的表达式)也许你需要:
int i = (bs[0] << 24) + (bs[1] << 16) + (bs[2] << 8) + bs[3] ;

如果不是所有4字节存在,你必须检查长度。

+0

根据OP当前方法测试您的方法。你会看到它不会产生相同的结果。 – erickson 2011-06-01 18:16:11

0

它看起来像你正试图像123[49, 50, 51] ASCII文本三个字节转换为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; 
} 
相关问题