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 + "";
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

4

3 回答 3

2

196 超出 的范围byte,一个有符号值。字节的范围可以从 -128 到 127。

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

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

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

"" + prostie4 + prostie3 + prostie2 + prostie1

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

于 2013-07-13T16:58:35.320 回答
1

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

因此196是不可解析的 --> NumberFormatException

& 0xff除了读入更大的类型并获取字节之外,您没有太多工作要做:

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

或者帮自己一个忙,使用 Guava,它有UnsignedBytes

final byte b = UnsignedBytes.parseUnsignedByte(theString);

但是您似乎还是想进行比较;所以只需使用比byte. 不,这不会浪费内存:不要忘记对齐。

于 2013-07-13T16:54:40.053 回答
0

文档中所述

NumberFormatException如果发生以下任何一种情况,则会引发类型异常:

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

在您的情况下,自 196 年以来的最后一种情况不能表示为字节。有效范围是 -128 到 127

于 2013-07-13T16:42:31.893 回答