【问题标题】:Java convert Byte Array of ASCII values to intJava将ASCII值的字节数组转换为int
【发布时间】:2014-12-27 01:10:53
【问题描述】:

在将 ByteBuffer 读入 b_array 后,我试图将 ascii 值转换为 int。

执行代码后我期望的输出是 129,因为(b_array[] 的十进制等效于 ascii 代码 49,50,59)

谁能告诉我我在哪里做错了。我正在执行 0xFF 以使其成为 java 中的无符号值,然后进行 OR 操作以移动字节。

        byte[]  b_array=new byte[3];            
        buffer.get(b_array,0,3);            
        // Contents inside the b_array in ascii code
        //  b_array[0]=49;
        //  b_array[1]=50;
        //  b_array[2]=57;       

        int value=  b_array[2] & 0xFF | (b_array[1] & 0xFF) << 8 | (b_array[0] & 0xFF) << 16;       
        System.out.println(value);

【问题讨论】:

  • 你为什么会期望 129?您正在制作的是一个四字节整数,其中三个最低有效字节设置为 49、50 和 59。这应该给您49 * 256 * 256 + 50 * 256 + 59,而不是 129。
  • 对。我可以在这个 sn-p 中进行任何更改以达到 129 吗?因为 1,2,9 的每个数字对应 49,50,59 的 ascii 值
  • 要获取字符串“129”中的字符,您需要将您的 ascii 转换为字符,无论是否是字符串,而不是整数。尝试将字节的 ascii 编码为字符串。
  • 是的,根据您的默认编码,Integer.parseInt(new String(b_array)) 可能会起作用。

标签: java byte bytearray operator-keyword


【解决方案1】:

您当前的方法有效地将这三个值视为 24 位数字 - 实际上是 0x313239。

听起来您应该将其转换为字符串,然后对其进行解析:

String text = new String(b_array, StandardCharsets.US_ASCII); // "129"
int value = Integer.parseInt(text);

【讨论】:

  • 正确的乔恩。我做了一个 int myInt = Integer.parseInt(new String(b_array));但我的代码必须解析数百万条消息。所以它会创建很多字符串对象对吧?
  • @JavaEnthusiast 不用字符串也很容易:(b_array[2]-'0')*100+(b_array[1]-'0')*10+b_array[0]-'0' 你只需要记住,ASCII 中的数字字符与实际数字不同,区别是'0',也就是十进制的 48 .
  • @biziclop:虽然你可以这样做,但我个人认为这远不如仅仅创建字符串那么清晰。
  • @JonSkeet 绝对。而且我个人也不会打扰,除非我有确凿的证据证明所有这些 String 对象确实会导致性能问题。我只是想澄清一下,不可行的不是 OP 的方法,而是它的实现。
  • @JavaEnthusiast:“肯定”在没有证据的情况下听起来非常强大 - 你有任何证据表明这是一个问题吗?我刚刚尝试以这种方式解析一个字节数组 10,000,000 次,并且在我的笔记本电脑上花费了不到一秒钟的时间。还是觉得有问题?
猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 2017-08-22
  • 2011-09-16
  • 2011-08-06
  • 1970-01-01
  • 2011-09-04
  • 2015-02-01
相关资源
最近更新 更多