二进制表示到一个新字节

时间:2013-07-13 16:35:59

标签: java byte bit

我正在尝试创建一个知道一定数量位的新字节

char prostie1 = theRepChars[j-3];
char prostie2 = theRepChars[j-2];
char prostie3 = theRepChars[j-1];
char prostie4 = theRepChars[j];
String prostiaMare = prostie4 + prostie3 + prostie2 + prostie1 + "";
Byte theChar = new Byte(prostiaMare);

当我这样做时,我得到一个NumberFormatException值为196。

我不知道可能是我的问题

- 编辑 -

好吧我想我可能不得不提供更多细节,因为我不太清楚。我正在尝试使用Uuencode算法,并且遵循算法的逻辑,我应该停止我的字节的值大于194.这是我的一堆代码。

if(my_chars.length % 3 == 0)
    {

        for(int x = 0; x < my_chars.length; x++)
        {
                if((x+1) % 3 == 0)
                {
                    char first = my_chars[x-2];
                    char second = my_chars[x-1];
                    char third = my_chars[x];
                    int n = (((first << 8) | second) << 8) | third;
                    String theRep = Integer.toBinaryString(n);
                    while(theRep.length() < 24 - 1)
                    {
                        theRep = 0 + theRep;
                    }
                    //0 padded theRep
                    for(int j = 0; j < theRepChars.length; j++)
                    {
                        if((j+1) % 4 == 0)
                        {
                            char prostie1 = theRepChars[j-3];
                            char prostie2 = theRepChars[j-2];
                            char prostie3 = theRepChars[j-1];
                            char prostie4 = theRepChars[j];
                            String prostiaMare = prostie4 + prostie3 + prostie2 + prostie1 + "";
                            System.out.println(prostiaMare);

                        }
                    }



                }
        }


    }

尝试使用prostiaMare的值创建一个新字节,这给了我numberFormatException。我不确定我是否没有正确地遵循算法(http://www.herongyang.com/encoding/UUEncode-Algorithm.html

3 个答案:

答案 0 :(得分:2)

196超出byte范围,签名值。字节数可以在-128到127之间。

我不确定你为什么要投射到String。如果您只想要一个字节,其位数等于四个字符之和的位,则直接转换为byte:

(byte) (prostie4 + prostie3 + prostie2 + prostie1)

如果您打算从四个字符构造一个字符串,那么您目前不会这样做。使用:

"" + prostie4 + prostie3 + prostie2 + prostie1

并且,如果结果在一个字节的范围内,您可以像以前一样创建一个字节。

答案 1 :(得分:1)

字节在Java中签名。这意味着byte,其长度为8位,最小值为-2 ^ 7(-128),最大值为2 ^ 7 - 1(127)。除了char(无符号,16位)之外,Java没有无符号基本类型。

因此196是不可解析的 - &gt; NumberFormatException

除了读取更大的类型并执行& 0xff以获取字节外,您没有太多可以解决此问题:

final int i = Integer.parseInt(theString);
final byte b = (byte) (i & 0xff);

或者帮自己一个忙,并使用具有UnsignedBytes

的番石榴
final byte b = UnsignedBytes.parseUnsignedByte(theString);

但似乎你想要进行比较;所以只使用比byte更大的类型。不,这不会浪费记忆:不要忘记对齐。

答案 2 :(得分:0)

正如docs

中所述

如果出现以下任何一种情况,则抛出类型NumberFormatException的异常:

  • 第一个参数是null或是一个长度为zero的字符串。
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX
  • 字符串的任何字符都不是指定基数的数字,除了第一个字符可能是减号' - '('\ u002D'),前提是字符串长度超过长度。
  • 字符串表示的值不是byte类型的值。

在你的情况下,它自196以来的最后一个案例不能表示为byte ..有效范围是-128到127