Java字节[]返回相同的字符串,即使字节[]数组更改为添加一些填充
我正在学习理解字符串的位/字节概念。我试图更改给定字符串的byte[]数组,但我惊讶地发现,即使更改byte[],字符串表示形式也是相同的。下面是我的代码示例。有人能帮助理解为什么吗?如果可能的话,请分享关于字节和Sting关系的更多见解的教程Java字节[]返回相同的字符串,即使字节[]数组更改为添加一些填充,java,Java,我正在学习理解字符串的位/字节概念。我试图更改给定字符串的byte[]数组,但我惊讶地发现,即使更改byte[],字符串表示形式也是相同的。下面是我的代码示例。有人能帮助理解为什么吗?如果可能的话,请分享关于字节和Sting关系的更多见解的教程 public class HelloWorld{ //Add padding to input value to public static byte[] addPadding(byte[] inData, int offset, i
public class HelloWorld{
//Add padding to input value to
public static byte[] addPadding(byte[] inData, int offset, int len) {
byte[] bp = null;
int padChars = 8; // start with max padding value
int partial = (len + 1) % padChars; // calculate how many extra bytes exist
if (partial == 0) padChars = 1; // if none, set to only pad with length byte
else padChars = padChars - partial + 1; // calculate padding size to include length
bp = new byte[len + padChars];
bp[0] = Byte.parseByte(Integer.toString(padChars));
System.arraycopy(inData, offset, bp, 1, len);
return bp;
}
//remove padding added while decryption
public static byte[] removePadding(byte[] inData) {
byte[] bp = null;
int dataLength = 0;
int padLength = 0;
padLength = inData[0];
dataLength = inData.length - padLength;
bp = new byte[dataLength];
System.arraycopy(inData, 1, bp, 0, dataLength);
return bp;
}
public static void main(String []args){
String inputString = "I like coding :-)";
byte[] byteArrayOfString = inputString.getBytes();
System.out.println("Original String: " + new String (byteArrayOfString));
byteArrayOfString = addPadding(byteArrayOfString, 0, byteArrayOfString.length);
//Add padding
System.out.println("String after adding pad: " + new String (byteArrayOfString));
//remove padding
byteArrayOfString = removePadding(byteArrayOfString);
System.out.println("String after removing pad: " + new String (byteArrayOfString));
}
}
以下是我运行此程序时的输出:
Original String: I like coding :-)
String after adding pad: I like coding :-)
String after removing pad: I like coding :-)
令人惊讶的是,所有的输出都是相同的。好奇为什么?它们不一样。填充字符串只包含非打印字符
String inputString = "I like coding :-)";
byte[] byteArrayOfString = inputString.getBytes();
String original = new String (byteArrayOfString);
System.out.println("Original String: " + original);
byteArrayOfString = addPadding(byteArrayOfString, 0, byteArrayOfString.length);
//Add padding
String addPadding = new String (byteArrayOfString);
System.out.println("String after adding pad: " + addPadding);
//remove padding
byteArrayOfString = removePadding(byteArrayOfString);
String removePadding = new String (byteArrayOfString);
System.out.println("String after removing pad: " + removePadding);
System.out.println(Arrays.toString(original.toCharArray()));
System.out.println(Arrays.toString(addPadding.toCharArray()));
System.out.println(Arrays.toString(removePadding.toCharArray()));
印刷品
Original String: I like coding :-)
String after adding pad: I like coding :-)
String after removing pad: I like coding :-)
[I, , l, i, k, e, , c, o, d, i, n, g, , :, -, )]
[, I, , l, i, k, e, , c, o, d, i, n, g, , :, -, ), , , , , , ]
[I, , l, i, k, e, , c, o, d, i, n, g, , :, -, )]
(请参阅。)它确实打印了额外的字符;你只是没看到他们。我在每个字符串打印之前和之后添加了引号字符,下面是我在IntelliJ中的输出外观
Original String: "I like coding :-)"
String after adding pad: " I like coding :-) "
String after removing pad: "I like coding :-)"
然而,当我在终端窗口中运行此代码时,我得到了如下结果,就像您所做的那样:
Original String: "I like coding :-)"
String after adding pad: "I like coding :-)"
String after removing pad: "I like coding :-)"
而且,更重要的是,我听到了终端的哔哔声
填充是用7号字符完成的,即钟形字符。IntelliJ显然只是打印了一个空格,但我的油灰终端发出了正确的嘟嘟声。尾随空格似乎也消失了
返回前在addPadding
中打印字节数组内容会显示字节数组内容
System.out.println(Arrays.toString(bp));
这是输出:
[7, 73, 32, 108, 105, 107, 101, 32, 99, 111, 100, 105, 110, 103, 32, 58, 45, 41, 0, 0, 0, 0, 0, 0]
首先是铃形字符7
,然后是字符串的字符,然后是空字符0
(\u0000
)。IntelliJ也必须将这些打印为空格;油灰端子不打印它们
总之,填充物是存在的;你只是看不到字符被打印出来。根据您的输出方法,您可能会听到其中的一个。humm,您是对的,我添加了相等检查,它显示不相等//检查是否相等(inputStringAfterPadding.equals(inputStringAfterRemovePadding)){System.out.println(“填充后的字符串与移除填充XXXX后的字符串相同”);}else{System.out.println(“填充后的字符串与删除填充后的字符串不同:-):-);}为什么即使更改字符串的第一个字节位置,它也不会更改显示