【问题标题】:Convert 3 bytes array to number将 3 字节数组转换为数字
【发布时间】:2014-07-31 12:31:54
【问题描述】:

我使用以下代码将一个短数字转换为 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? 我想这与位移和数据丢失有关吗?还是有符号字节?

【问题讨论】:

  • 顺便说一句:您返回 int 而不是 short
  • 对!我已经更改了方法名称,所以没有人会感到困惑。最后,它是 int 还是 short 对我来说并不重要,因为我关心数字。

标签: java arrays byte short


【解决方案1】:

试试这个修改后的方法:

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

在数组中有些字节是负数,您需要在进行位移之前使用byteVal &amp; 0xFF将它们转换回“正值”

【讨论】:

  • 使用“byteVal”和“byteVal & 0xFF”有区别吗?为什么,如何?他们不是一回事吗?
  • @DavutÖzcan 假设我们有short shortVal = 255; byte byteVal = shortVal;,那么byteVal 的值就是-1。如果我执行byteVal &amp; 0xFF,那么 JVM 会执行此操作:在内部将 byteVal“转换”为 int(值为 -1),然后它执行 &amp; 位操作,0xFF 返回一个整数值(255)。总之:不是一回事(byteVal = -1 and byteVal & 0xFF = 255)
【解决方案2】:

短片有 16 位信息,因此是两个字节。当您尝试使用| (b[2] &lt;&lt; 16) 存储第三个字节时,它会超出short 位的末尾,这是一个问题。 IE。你不能做你想做的事。

【讨论】:

    【解决方案3】:

    更改为使用 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2014-08-08
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2011-07-02
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多