将无符号整数值插入bytebuffer,维护二进制表示

时间:2014-12-18 13:55:51

标签: java bytebuffer unsigned-integer

我试图将以下二进制表示法放入一个4字节的字节缓冲区中。但由于Java没有签名,我遇到了麻烦:11111111000000001111111100000000

ByteBuffer bb = ByteBuffer.allocate(8);

bb.putInt(Integer.parseInt("11111111000000001111111100000000", 2));
//throws numberformatexception

否定最重要的位似乎改变了二进制字符串值,因为两个赞美的工作原理如下:

bb.putInt(Integer.parseInt("-1111111000000001111111100000000", 2));
System.out.println(Integer.toBinaryString(bb.getInt(0)));
//prints 10000000111111110000000100000000

值非常重要,因为以后它将被视为unsigned int。我应该如何将值(以及以1开头的未来值)添加到bytebuffer?

3 个答案:

答案 0 :(得分:1)

首先将其解析为long,然后转换结果:

int value = (int) Long.parseLong("11111111000000001111111100000000", 2);

处理int空间不足的事实,因为long中有足够的空间。在转换之后,该值将以负int结束,但这很好 - 它将最终在字节缓冲区中正确结束。

编辑:如评论中所述,在Java 8中,您可以使用Integer.parseUnsignedInt("...", 2)

答案 1 :(得分:1)

您还可以使用番石榴的UnsignedInts.parseUnsignedInt(String string, int radix)UnsignedInts.toString(int x,int radix)方法:

int v = UnsignedInts.parseUnsignedInt("11111111000000001111111100000000", 2);
System.out.println(UnsignedInts.toString(v, 2));

答案 2 :(得分:0)

试试这个

    bb.putInt((int)Long.parseLong("11111111000000001111111100000000", 2));