字节数组转int的解释

Explanation of byte array to int

这是我使用的代码:

byte[] arr = {127,12,-74,85,-3,0,-112,104,.........}; //size: 1024              
ByteBuffer wrapped = ByteBuffer.wrap(arr); 
short num = wrapped.getShort(); 

取自here

在我的应用程序中娱乐:

public void(byte[] bytes) {
    byte[] arr = bytes;
    ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
    short num = wrapped.getShort(); // 1

    Log.i("bytes",""+num);}

我有一个大小为 1024 字节的字节数组[1024],其中每个字节的值在 127 到 -128 之间。当我 运行 上面的代码时,对于每个大小为 1024 的字节数组,我得到 num 的值作为 -27356, 30647, 28033, -29854...。我有很多字节数组,我在方法中传递。

我没看懂 num 的代码和值。这里发生了什么?

假设:

byte[] bytes={127,12,-74,85,-3,0,-112,104,.........} size: 1024
  1. bytebuffer.wrap() 是做什么的?
  2. 如果我像这样放置字节:bytebuffer.wrap(bytes),会发生什么?
  3. 什么是getshort()方法?它有什么作用?
  4. num值代表什么?
  5. num 是否表示大小为 1024 的整个字节数组的单个整数值?

1)What does bytebuffer.wrap()do?

参见javadoc将字节数组包装到缓冲区中。新缓冲区将由给定的字节数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。新缓冲区的容量和限制将为 array.length,其位置将为零,其标记为未定义。它的支持数组将是给定的数组,它的数组偏移量将为零。

2)If i put bytes like this: bytebuffer.wrap(bytes),what will happen?

您得到 byte[] 支持的 ByteBuffer。参见#1。

3)What is getshort() method?What does it do?

参见javadoc读取此缓冲区当前位置的下两个字节,根据当前字节顺序将它们组合成一个短值,然后将位置递增 2。

4)What does "num" value represent?

从缓冲区读取的两个字节的有符号值。参见#3。

5)Is "num" representing single integer value of entire byte array of size 1024?

不是,代表两个字节的值。参见 #3 和 #4。


您可能还想了解 2 的补码:
What is “2's Complement”?(计算器溢出)
Two's_complement(维基百科)

1) bytebuffer.wrap() 有什么作用?

ByteBuffer.wrap 获取一个现有的 byte[] 并从中创建一个 ByteBuffer,公开对应于缓冲区关系操作的方法,例如 getShort()。

2) 如果我像这样放置字节:bytebuffer.wrap(bytes),会发生什么?

您将用 bytes 的内容而不是 arr 填充 ByteBuffer,可以说因为 arr 刚刚被分配给 bytes 之前,这将是一个好的操作。如果您打算稍后将字节用作原始值,但复制它是个好主意,但此代码中不存在。

3) getshort() 方法是什么?它有什么作用?

缓冲区包含恒定的字节流和当前位置。当您 getShort() 时,您从当前位置读取两个字节并将它们放入短结构中。如您问题下方的评论所示

If two byte values are hex 0x95,0x24, decimal -107,36, then short is hex 0x9524, decimal -27356

这些被附加为 0x9524 所示,然后读出就好像它是一个短结构,而不是两个字节。这将删除一个符号位并将其视为数据位,如果第一个值为负,则为您提供一个大的负值。

4) "num"值代表什么?

如果不说显而易见的话,这很难回答。它表示由一个短数据组成的前两个字节。在您的第一个示例中,您使用

byte[] arr = { 0x00, 0x01 };

附加的是短的 0x0001,给你值 1。通常你创建的这个 "num" 变量在网络 I/O 数据包结构中这样使用,它通常表示字节数在第一个短片或数据包类型之后的数据包中,例如 "Game Data" 或类似的。

byte[] arr={127,12,-74,85,-3,0,-112,104,.........}

在这种情况下,它将首先读取字节 127 和 12。这些对应于 0x7F 和 0x0C,这将给出 "num" = 0x7F0C = 32524。当您使用不同的字节数组调用此方法时,只有第一个num.

中占了两个数

5) "num" 是否表示大小为 1024 的整个字节数组的单个整数值?

不,它只代表前面问题中显示的前两个字节。数组的大小只要大于 2(在正常系统上为 sizeof(short) = 2)就没有关系。