字节数组长度在变换前后变化

Geo*_*ang 2 java arrays string bytearray data-conversion

我需要通过Internet发送和接收大字节数组(http restful service).

我能想到的最简单的方法是将字节数组转换为字符串.

我搜索了一下,发现这个帖子Java Byte Array to String to Byte Array

我有以下代码来验证转换的准确性.

    System.out.println("message");
    System.out.println (message);

    String message = "Die Strahlengriffelgewächse stammen...";

    byte[] pack = Fbs.packExce(message);    
    System.out.println ("pack");
    System.out.println (pack);
    System.out.println ("packlenght:" + pack.length);

    String toString = new String(pack);
    System.out.println ("toString");
    System.out.println (toString);

    byte[] toBytes = toString.getBytes();
    System.out.println ("toBytes");
    System.out.println (toBytes);
    System.out.println ("toByteslength:" +toBytes.length);
Run Code Online (Sandbox Code Playgroud)

"Fbs.packExce()"是一种获取大块字符串并生成大字节数组的方法.

我改变了消息的长度,检查并打印出字节数组的长度,然后转换为字符串并转换回来.

我得到了以下结果:

...
pack
[B@5680a178
packlenght:748
...
toBytes
[B@5fdef03a
toByteslength:750

----------------------

...
pack
[B@5680a178
packlenght:1016
...
toBytes
[B@5fdef03a
toByteslength:1018
Run Code Online (Sandbox Code Playgroud)

我省略了"消息",因为它太长了.

10次​​中的8次,我可以看到派生的字节数组(新的,称"toBytes")比原始字节数组("pack")长2个字节

我说过10个中的8个,因为在派生和原始之间的长度相同的情况下也会出现,见下文

...
pack
[B@5680a178
packlenght:824
toString
...
toBytes
[B@5fdef03a
toByteslength:824       
...
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚确切的规则.

有没有人有任何想法?

或者有没有更好的方法将字节数组转换为字符串?

干杯

Ste*_*n C 6

我能想到的最简单的方法是将字节数组转换为字符串.

最简单的方法是错误的方式.对于大多数字符编码,将任意字节序列转换为文本可能是有损的.

更好(即更强大)的方法是使用Base64编码.阅读的javadocBase64类及其相关的编码和解码器类.


如果你坚持尝试转换任意字节顶部字符并返回使用new String(byte[])等:

  • 请确保选择字符编码,其中字节 - >字符 - >字节转换序列不是有损的.(LATIN-1将起作用)

  • 不要依赖当前执行平台的编码/解码字符集的默认字符编码.

  • 在客户端/服务器系统中,客户端和服务器必须使用相同的编码.