将3字节数组转换为数字

时间:2014-07-31 12:31:54

标签: java arrays byte short

我使用以下代码将短数字转换为 3字节数组

static byte[] convertTo3ByteArray(short s) {

   byte[] ret = new byte[3];
   ret[0] = (byte) (s & 0xff);
   ret[1] = (byte) ((s >> 8) & 0xff);
   ret[2] = (byte) (0x00);

   return ret;
}

这非常有效。

我在Stackoverflow上找到了一个代码,用于将数组转换回数字:

static int convertToInt(byte[] b) {
   return ((b[0] << 0) | (b[1] << 8) | (b[2] << 16));
}

当我将 258 转换为字节数组,然后使用此代码时,它会返回 258

但是对于数字 675 ,此代码返回 -93

如何更改 convertToShort 方法以获取 675 ? 我想它与bithift和数据丢失有关?或签名字节?

3 个答案:

答案 0 :(得分:2)

尝试使用此修改后的方法:

static int convertToShort(byte[] b) {
    return (((b[0] & 0xFF) << 0) | ((b[1] & 0xFF) << 8) | ((b[2] & 0xFF) << 16));
}

在数组中,一些字节为负数,您需要将它们转换回&#34;正值&#34;在进行位移之前使用byteVal & 0xFF

答案 1 :(得分:1)

short有16位信息,因此这将是两个字节。当您尝试使用| (b[2] << 16)存储第三个字节时,它将在短位的末尾结束,这是一个问题。即你不能做你想做的事。

答案 2 :(得分:1)

更改为使用char数据类型将解决此问题,因为它们是Java中唯一的无符号类型:

https://stackoverflow.com/a/21089624/1590490

static char[] convertTo3ByteArray(short s) {

    char[] ret = new char[3];
    ret[0] = (char) (s & 0xff);
    ret[1] = (char) ((s >> 8) & 0xff);
    ret[2] = (char) (0x00);

    return ret;
}

static int convertToShort(char[] b) {
    return ((b[0]) | (b[1] << 8) | (b[2] << 16)); // the original << 0 shift does nothing
}