我有一个包含文字(大写和小写)和数字(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);
我还想交换所有数字,即将所有0替换为9,全部为1乘以8,以此类推,但无法确定确切的陈述。我试过了:
if(bytes[i] >= '0' && bytes[i] <= '9') bytes[i] = (byte)( '0' + (bytes[i] - '9'));
但它只是为我的输出添加了一些特殊的字符,所以我认为if语句是错误的。知道如何在字节操作中交换这些数字吗?
答案 0 :(得分:2)
您的操作数顺序错误。
bytes[i] = (byte)( '9' - (bytes[i] - '0'));
当做这样的事情时,总是有一个ascii表http://www.asciitable.com/
答案 1 :(得分:1)
就操纵数字时的特殊字符而言,你的减法方法是错误的:
'0' + (bytes[i] - '9')
应该是
'0' + ('9' - bytes[i])
如果您正在操纵字符,请使用String.toCharArray()
,而不是String.getBytes()
:String
逻辑上是char[]
,而不是byte[]
。
字符串中的单个字符可以转换为两个字节;对单个字节进行算术运算可能会导致您更改字符的“一半”,这可能会在您尝试将其转换回字符串时产生时髦的结果。
你可以使用chars做同样的事情:
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])
(数字存在类似的方法)会更容易阅读并且不易出错,而不是对字符值进行算术运算。
答案 2 :(得分:0)
您无法使用替换数字,就像更换下部到上部一样,反之亦然。因为数字的ASCII值是串联的,所以你超出了这个限制。而不是你必须尝试10如果这样的条件;
if(bytes[i] == '0')
bytes[i] = '9'
else if(bytes[i] == '1')
bytes[i] = '8'
依旧......