字节数组到int

时间:2016-03-17 06:19:07

标签: java types bytearray endianness bytebuffer

这是我使用的代码:

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的整个字节数组的单个整数值吗?

2 个答案:

答案 0 :(得分:0)

  

1)bytebuffer.wrap()做什么?

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

  

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

您获得了ByteBuffer支持的byte[]。见#1。

  

3)什么是getshort()方法?它做了什么?

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

  

4)" num"价值代表?

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

  

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

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

您可能还想了解2补充:
What is “2's Complement”?(StackOverflow)
Two's_complement(维基百科)

答案 1 :(得分:0)

1)bytebuffer.wrap()做什么?

ByteBuffer.wrap接受一个现有的byte []并从中创建一个ByteBuffer,公开与缓冲关系动作相对应的方法,如getShort()。

2)如果我输入这样的字节:bytebuffer.wrap(bytes),会发生什么?

你将用字节的内容而不是arr填充ByteBuffer,可以说因为arr被分配给之前的字节,这将是一个好的动作。虽然如果你打算稍后使用字节作为原始值但是在这段代码中不存在,那么获取它的副本是个好主意。

3)什么是getshort()方法?它做了什么?

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

  

如果两个字节值是十六进制0x95,0x24,十进制-107,36,那么short是   十六进制0x9524,十进制-27356

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

4)" num"价值代表什么?

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

  

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

当附加时,短的0x0001给你的值为1.通常这个" num"您创建的变量在网络I / O数据包结构中使用如此,它通常表示在第一个短路或数据包类型之后数据包中的字节数,例如"游戏数据"或者类似地。

  

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

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

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

不,它仅代表前两个字节,如前面的问题所示。阵列的大小只要大于2(正常系统上的sizeof(短)= 2)并不重要。