按字节操作交换字符串中的数字

Swap numerals in a String by byte operation

我有一个很长的字符串,其中包含文字(大写和小写)和数字(0 到 9)。

我正在对该字符串进行一些字节操作。因此,例如,我将所有大写文字替换为它们的小写等价物,如下所示:

byte[] bytes = myString.getBytes();

for (int i = 0; i < bytes.length; i++) {
    if(bytes[i] >= 'A' && bytes[i] <= 'Z')
        bytes[i] = (byte)( 'a' + (bytes[i] - 'A'));
}

myString = new String(bytes);

我也想交换所有数字,即用 9 替换所有 0,用 8 替换所有 1,依此类推,但无法找出确切的语句。我试过了:

if(bytes[i] >= '0' && bytes[i] <= '9') bytes[i] = (byte)( '0' + (bytes[i] - '9'));

但它只是在我的输出中添加了一些特殊字符,所以我认为 if 语句是错误的。知道如何在字节操作中交换这些数字吗?

您不能像将低位替换为高位那样来替换数字,反之亦然。因为数字的 ASCII 值是连续的,而您超出了该限制。相反,你必须尝试 10 if 条件是这样的;

if(bytes[i] == '0')
    bytes[i] = '9'
else if(bytes[i] == '1')
    bytes[i] = '8'

等等....

就处理数字时的特殊字符而言,你的减法是错误的:

'0' + (bytes[i] - '9')

应该是

'0' + ('9' - bytes[i])

如果要处理字符,请使用 String.toCharArray(),而不是 String.getBytes()String 在逻辑上是 char[],而不是 byte[]

字符串中的单个字符可能会转换为两个字节;对单个字节进行算术运算可能会导致您更改字符的 "half",当您尝试将其转换回字符串时,这可能会导致奇怪的结果。

您可以使用字符来做几乎相同的事情:

char[] chars = myString.toCharArray();

for (int i = 0; i < chars.length; i++) {
    if(chars[i] >= 'A' && chars[i] <= 'Z')
        chars[i] = (char) ('a' + (chars[i] - 'A'));
}

myString = new String(chars);

使用 Character.toLowercase(chars[i])(数字存在类似的方法)而不是对字符值进行算术运算会更容易阅读并且更不容易出错。

您的操作数顺序错误。

bytes[i] = (byte)( '9' - (bytes[i] - '0'));

当做这样的事情时,手头总是有一个 ascii table http://www.asciitable.com/