Java 有没有更好的方法将字节数组转换为int?

Java 有没有更好的方法将字节数组转换为int?,java,Java,字节数组的前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.pars

字节数组的前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));
}
public int parse_代码(字节[]bs){
char[]数组=新字符[3];
对于(int i=0;i<3;i++){
数组[i]=(字符)bs[i];
}
//肮脏的做法
返回Integer.parseInt(新字符串(数组));
}

您的示例代码似乎将
字节与其ASCII值相关联。正确的方法是使用
字符串
构造函数,该构造函数接受
字节
数组和字符集:

// 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"));

注意:如果
字节
s不是表示整数的ASCII字符值(例如,它只是一个
整数
编码为四个
字节
s),则您需要查看该类。它有一些助手,可以将
字节缓冲区
转换为其他缓冲区(例如),以便在所有类型都是一种类型时启用简单的允许循环(而不是混合消息,例如传入的C-struct或其他类型)。它还有一个额外的好处,就是可以改变endianness

int bytesValue = ByteBuffer.wrap(byteArray).getInt();

同样值得注意的是,正如x4u指出的那样,
ByteBuffer
确实需要为其获得的每个值提供适当数量的
byte
s。因此,上面的
getInt()
方法将使用接下来的4个
字节
s,如果有[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;
}
public int parse_代码(字节[]bs)
{
intval=0;
对于(int i=0;i<3;i++)
intval=intval*10+(bs[i]-“0”);
返回intval;
}

如果要将其转换为int,则数组的最大大小应为4,int不得超过214783647。然后:


inti=(bs[3]看起来您正在尝试将三字节的ASCII文本(如
123
转换为
[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;
}

它们是有符号的还是无符号的字节?在我们判断上面的代码是否正确之前,必须知道这一点。从上面的代码中,字节显然是ASCII数字。“字节”有问题的是数字字符,而不是二进制值。虽然这个建议对其他问题是正确的,但显然不适用于这里。ByteBuffers既不能解析ASCII数字,也不能处理长度为3字节的整数。@erickson已修改。@x4u你是对的,但我确实想保留该位,以备人们找到此fr时使用om搜索(当他们需要
ByteBuffer
时,标题会引导他们到这里)。@x4u但这是关于3字节部分的一个很好的注释。我实际上把它读为4,可能是因为它是一个4字节的数字。对照OPs当前方法测试你的方法。你会发现它不会产生相同的结果。