首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制表示形式转换为新字节

二进制表示形式转换为新字节
EN

Stack Overflow用户
提问于 2013-07-14 00:35:59
回答 3查看 114关注 0票数 0

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

代码语言:javascript
复制
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的值。下面是我的一些代码。

代码语言:javascript
复制
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 )

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-14 00:58:35

196不在有符号值byte的范围内。字节的范围从-128到127。

我不知道你为什么要转换成字符串。如果您只想要一个字节,其位等于四个字符的总和,则直接转换为byte:

代码语言:javascript
复制
(byte) (prostie4 + prostie3 + prostie2 + prostie1)

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

代码语言:javascript
复制
"" + prostie4 + prostie3 + prostie2 + prostie1

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-14 00:54:40

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

因此196是无法解析的--> NumberFormatException

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

代码语言:javascript
复制
final int i = Integer.parseInt(theString);
final byte b = (byte) (i & 0xff);

或者帮你自己一个忙,使用芭乐,它有UnsignedBytes

代码语言:javascript
复制
final byte b = UnsignedBytes.parseUnsignedByte(theString);

但是看起来您无论如何都想要进行比较;所以只需使用比byte更大的类型。不,这不会浪费内存:不要忘记对齐。

票数 1
EN

Stack Overflow用户

发布于 2013-07-14 00:42:32

正如在docs中提到的

如果发生以下情况之一,则会引发NumberFormatException类型的异常:

字节长度第一个参数是字节或长度为Character.MAX_RADIX.

  • Any的字符串。
  • 小于或大于字节。字符串的字符不是指定基数的数字,但如果字符串的长度大于1,则第一个字符可以是减号'-‘('\u002D')。null Character.MIN_RADIX
  • 字符串表示的值不是字节类型的值。

在您的情况下,这是自196以来的最后一种情况,不能表示为byte..The有效范围是-128到127

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17632111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档