逐字节操作交换数字

时间:2015-11-05 10:41:47

标签: java string bit-manipulation byte str-replace

我有一个包含文字(大写和小写)和数字(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语句是错误的。知道如何在字节操作中交换这些数字吗?

3 个答案:

答案 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'

依旧......