【问题标题】:Converting US-ASCII encoded byte to integer and back将 US-ASCII 编码字节转换为整数并返回
【发布时间】:2011-08-07 17:11:21
【问题描述】:

我有一个大小为 2,3 或 4 的字节数组。我需要将其转换为正确的整数值。我还需要反向执行此操作,即一个 2,3 或 4 个字符的整数到一个字节数组。

例如,原始十六进制字节为:54 和 49。解码后的字符串 US-ASCII 值为 61。因此整数答案需要为 61。

我已经阅读了我能找到的关于stackoverflow等的所有转换问题,但他们都给出了完全错误的答案,我不知道它是否可能是编码?

如果我做new String(lne,"US-ASCII"),其中lne 是我的字节数组,我得到正确的61。但是当我这样做((int)lne[0] << 8) | ((int)lne[1] & 0xFF) 时,我得到了完全错误的答案。

这可能是一个愚蠢的错误,或者我完全不了解 Java 中的数字表示方案和编码/解码思想。

任何帮助将不胜感激。

注意:我知道我可以将字符串解析为整数,但我想知道是否有一种方法可以使用快速运算,例如移位和二进制算术?

【问题讨论】:

    标签: java byte int


    【解决方案1】:

    以下是关于如何使用字节移位和十进制算术等快速运算来加快速度的想法。假设你有当前的代码:

    byte[] token;  // bytes representing a bunch of ascii numbers
    int n = Integer.parseInt(new String(token));  // current approach
    

    然后您可以替换最后一行并执行以下操作(假设没有负数、没有外语字符等):

    int n = 0;
    for (byte b : token)
      n = 10*n + (b-'0');
    

    出于兴趣,这让我在海量数据集上的速度提高了大约 28%。我认为这是因为不必分配新的 String 对象,然后在每次 parseInt 调用后将它们丢弃。

    【讨论】:

      【解决方案2】:

      您需要两个转换步骤。首先,将您的 ascii 字节转换为字符串。这就是new String(lne,"us-ascii") 为您所做的。 然后,将数字的字符串表示形式转换为实际数字。为此,您可以使用 Integer.parseInt(theString) 之类的东西——记得处理 NumberFormatException。

      【讨论】:

        【解决方案3】:

        正如你所说,new String(lne,"US-ASCII") 会给你正确的字符串。要将您的字符串转换为整数,请使用int myInt = Integer.parseInt(new String(lne,"US-ASCII"));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2019-03-09
          • 1970-01-01
          • 2021-01-20
          • 2011-04-10
          • 1970-01-01
          相关资源
          最近更新 更多