我正在尝试创建一个知道一定数量位的新字节
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)
答案 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
。在你的情况下,它自196以来的最后一个案例不能表示为byte ..有效范围是-128到127