按字节操作交换字符串中的数字
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/
我有一个很长的字符串,其中包含文字(大写和小写)和数字(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/