java 如何将一个内部有几个字节的数组转换成int格式的翻译?

c9qzyr3d  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(117)

给定一个4字节的数组(R,G,B,A),我试图把这个数组中的4个8位数字转换成32位的数字。

  1. byte[] tab = {1,2,3,4};

转换为二进制8位:
然后,我的方法应返回一个字节数组,如:

  1. newTab = {00000001_00000010_00000011_00000100};

由于某些原因,我试图在不使用String连接字节的情况下完成此操作。
我已经尝试过使用二元运算符,例如〈〈、〉〉或|,但如果没有成功...
到目前为止,我代码如下所示:

  1. byte[] tab = {1,2,3,4};
  2. int tmp,tabToInt = 0;
  3. for (int x = 0 ; x < tab.length ; ++x){
  4. tmp = tmp << (tab.length - 1 - x)*8;
  5. byteToInt = byteToInt | tmp;
  6. }
  7. return tabToInt;

但它似乎不起作用,更不用说负字节了...(如-1 = 0 b11111111)
提前感谢您的回答!

qpgpyjmq

qpgpyjmq1#

您可以像这样使用ByteBuffer

  1. byte[] tab = {1, 2, 3, 4};
  2. int tabToInt = ByteBuffer.wrap(tab).getInt();
  3. System.out.println("decimal = " + tabToInt);
  4. System.out.println("binary = " + Integer.toBinaryString(tabToInt));
  5. System.out.println("hexadecimal =" + Integer.toHexString(tabToInt));

输出功率

  1. decimal = 16909060
  2. binary = 1000000100000001100000100
  3. hexadecimal =1020304
sbtkgmzw

sbtkgmzw2#

ByteBuffer可以做到这一点,但只有当你得到传递至少4个字节。
您的代码存在两个问题:

  • 我想你在某个地方打了字,你的代码甚至没有编译。我想你指的是tmp = tab[x] << (tab.length - 1 - x)*8;。你的代码片段除了问它的长度之外,从来没有对tab做过任何事情。
  • 负数可以扩展,java会在你对它做任何运算的时候把任何字节或短整型转换成int,所以,0b1111 1111,如果你试图对它做<< 8,java首先把-1字节转换成-1 int(现在是321位),然后将其左移8位,现在是24个1位,后面是8个0位。然后将其按位OR到目标中,因此现在的目标大多数是1位。要将一个字节转换为没有**“符号扩展”的int**,(b & 0xFF可以这样做:
  1. byte b = (byte) 0b1111_1111;
  2. assert b == -1; // yup, it is
  3. int c = b; // legal
  4. assert c == -1; // yeah, still is. uhoh. That's...
  5. int d = 0b11111111_11111111_11111111_11111111;
  6. assert c == d; // yeah. We don't want that.
  7. int e = (b & 0xFF);
  8. assert e = 255;
  9. int f = 0b0000000_0000000_0000000_11111111;
  10. assert e == f; // yes!
展开查看全部

相关问题