我正在尝试对二进制字符串进行简单的剖腹产,并且它需要是可逆的。我用这种方法完成了这个..
public static String cShift(String ptxt, int addFactor)
{
String ascii = "";
for (int i = 0; i < ptxt.length(); i+=8)
{
int character = Integer.parseInt(ptxt.substring(i, i+8), 2);
byte sum = (byte) (character + addFactor);
ascii += (char)sum;
}
String returnToBinary = convertToBinary(ascii);
return returnToBinary;
}
在某些情况下这很好用。但是,我认为当它翻过一个字节表示时,它是不可逆转的。在测试字符串"test!22*F "
上,addFactor
为12
,字符串变得不可逆转。为什么这样,我怎么能阻止它呢?
编辑:为了清楚起见,测试字符串在传入之前转换为二进制。这是convertToBinary
public static String convertToBinary(String str)
{
char [] array = str.toCharArray();
String binaryToBeReturned = "";
for (int i = 0; i < str.length(); i++)
{
String binary = Integer.toBinaryString((int)array[i]);
binary = padZeroes(binary);
binaryToBeReturned += binary;
}
return binaryToBeReturned;
}
当我使用12的cShift运行它,然后使用-12的cShift来反转时,我得到了这个......
01110100011001010111001101110100001000010011001000110010010001100010101000100000
111111111000000001110001011111111111111110000000001011010011111000111110010100100011011000101100
ÿ?qÿ?->>R6,
ÿótesÿót!22F*
第一个字符串只是将测试字符串转换为二进制。第二个字符串是二进制cShift的结果。第三个字符串是将其转换为ascii的结果,第四个字符串是在cShift上使用-12反转并转换为ascii的结果。
我很清楚,不知何故从滚动中添加了额外的位,我不完全确定如何处理它。感谢。
答案 0 :(得分:1)
扩展到byte
时需要屏蔽char
,否则符号位将被扩展。
ascii += (char)(sum & 0xFF)
如果您不想使用符号扩展名,则在加宽有符号数字类型时会应用此蒙版模式。
anInt = aByte & 0xFF;
anInt = aShort & 0xFFFF;
aLong = anInt & 0xFFFFFFFFL; // notice the L
以下是一个例子来说明:
byte b = -1; // 0xFF
char ch = (char) b; // 0xFFFF
int i = ch;
System.out.println(i); // prints "65535", which is 0xFFFF
byte b = -1; // 0xFF
char ch = (char) (b & 0xFF); // 0xFF
int i = ch;
System.out.println(i); // prints "255", which is 0xFF
这里有一个教训。如果您已阅读Java Puzzlers,则会看到一些围绕符号扩展箍的内容。这本书中的这个谜题与我上面的谜题基本相同,但可能更令人困惑:
// Java Puzzlers, Puzzle 6: Multicast
System.out.println((int) (char) (byte) -1); // prints 65535
有两种方法可以解决这个问题:
byte
和short
。你很少需要。byte
到char
总是很棘手,因为:
char
比byte
... char
未签名而byte
是!!! 以下转换结合了扩展和缩小基元转换:
byte
至char
。首先,
byte
通过加宽基元转换转换为int
,然后通过缩小基元转换将结果int
转换为char
。