我有一个大小为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中的数字表示方案和编码/解码的想法。
任何帮助都将不胜感激。
注意:我知道我可以将String解析为整数,但我想知道是否有办法使用快速操作,如移位和二进制算术?
答案 0 :(得分:4)
以下是关于如何使用字节移位和十进制算术等快速操作来加快速度的想法。假设您有当前代码:
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
调用后将其删除。
答案 1 :(得分:3)
您需要两个转换步骤。首先,将您的ascii字节转换为字符串。这就是new String(lne,"us-ascii")
为你做的事情。 然后,将数字的字符串表示形式转换为实际数字。为此您使用Integer.parseInt(theString)
之类的东西 - 记得处理NumberFormatException。
答案 2 :(得分:1)
如你所说,new String(lne,"US-ASCII")
会给你正确的字符串。要将String转换为整数,请使用int myInt = Integer.parseInt(new String(lne,"US-ASCII"));