我对按位操作的学习时间很短。 我想转换大整数(> 127)值而不执行'<<'或任何类似的东西。
我需要整数值的字节表示,用于标识UDP中发送的报头中的数据包序列号。如果没有解决方案,我会引入两个字节..
类似于:1,1; 1,2; 1,3;丢包; 1,4;丢包; 2,1,2,2 然后在达到127时重置它; 127
我可以介绍第三,但这很难看。
使用作为java api的一部分的黑盒子为我做所有字节转换真的很有用。有吗?
谢谢,
答案 0 :(得分:1)
问题是否需要无符号字节,如128和255之间的数字?
这是......棘手。 Java语言不会让你直接将字节视为无符号...但是有了库支持它会变得容易一些。 Guava为其中一些需求提供了UnsignedBytes实用程序类。有符号和无符号字节的加法,乘法和减法完全相同。
编辑:根据您的其他评论,您可能会对Ints.toByteArray(int)等感兴趣,因为它们适用于byte
和BigInteger
之间的类型。
答案 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个字节。