有没有办法在不执行按位运算的情况下以127以上的字节表示int值?

时间:2012-02-06 22:04:12

标签: java

我对按位操作的学习时间很短。 我想转换大整数(> 127)值而不执行'<<'或任何类似的东西。

我需要整数值的字节表示,用于标识UDP中发送的报头中的数据包序列号。如果没有解决方案,我会引入两个字节..

类似于:1,1; 1,2; 1,3;丢包; 1,4;丢包; 2,1,2,2  然后在达到127时重置它; 127

我可以介绍第三,但这很难看。

使用作为java api的一部分的黑盒子为我做所有字节转换真的很有用。有吗?

谢谢,

3 个答案:

答案 0 :(得分:1)

问题是否需要无符号字节,如128和255之间的数字?

这是......棘手。 Java语言不会让你直接将字节视为无符号...但是有了库支持它会变得容易一些。 Guava为其中一些需求提供了UnsignedBytes实用程序类。有符号和无符号字节的加法,乘法和减法完全相同。

编辑:根据您的其他评论,您可能会对Ints.toByteArray(int)等感兴趣,因为它们适用于byteBigInteger之间的类型。

答案 1 :(得分:1)

将无符号8位值打包到byte

static byte toByte(int i) {
  if ((i < 0) || (i > 255))
    throw new IllegalArgumentException(String.valueOf(i));
  return (byte) i;
}

转换回来:

static int toInt(byte b) {
  return (b < 0) ? (b + 256) : b;
}

在阅读了对其他答案的评论之后,听起来你可能想要这样的事情:

byte[] b = BigInteger.valueOf(counter).toByteArray();

long counter = new BigInteger(b).longValue();

由于数组的长度会随着计数器的增长而变化,因此您需要某种方式来指示其长度或分隔它。但是这种技术会将任何整数值转换为字节数组。

答案 2 :(得分:-2)

根据我的理解,你想把一个int分成4个字节。如果是这样,那么只需复制粘贴此代码:

int i = /* your int */

int[] b = { (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff };

指数0-3分别是int中的4个字节。