这是我使用的代码:
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
bytebuffer.wrap()
做什么?bytebuffer.wrap(bytes)
,会发生什么? getshort()
方法?它做了什么?num
值代表什么?num
表示大小为1024的整个字节数组的单个整数值吗?答案 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)并不重要。