Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节[]返回相同的字符串,即使字节[]数组更改为添加一些填充_Java - Fatal编程技术网

Java字节[]返回相同的字符串,即使字节[]数组更改为添加一些填充

Java字节[]返回相同的字符串,即使字节[]数组更改为添加一些填充,java,Java,我正在学习理解字符串的位/字节概念。我试图更改给定字符串的byte[]数组,但我惊讶地发现,即使更改byte[],字符串表示形式也是相同的。下面是我的代码示例。有人能帮助理解为什么吗?如果可能的话,请分享关于字节和Sting关系的更多见解的教程 public class HelloWorld{ //Add padding to input value to public static byte[] addPadding(byte[] inData, int offset, i

我正在学习理解字符串的位/字节概念。我试图更改给定字符串的byte[]数组,但我惊讶地发现,即使更改byte[],字符串表示形式也是相同的。下面是我的代码示例。有人能帮助理解为什么吗?如果可能的话,请分享关于字节和Sting关系的更多见解的教程

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(“填充后的字符串与删除填充后的字符串不同:-):-);}为什么即使更改字符串的第一个字节位置,它也不会更改显示