【问题标题】:How do I convert a byte array with null terminating character to a String in Java?java - 如何将具有空终止字符的字节数组转换为Java中的字符串?
【发布时间】:2012-01-12 22:22:54
【问题描述】:

如何从字节数组创建字符串对象

byte arr[MAX_SIZE];  // Java

其中一个数组元素是 C 空终止字节?是不是就这么简单的调用

String str = new String( arr );

String 构造函数是否知道在空终止字符处自动停止?空字节之后的任何字节都是(可能)我不想包含在字符串中的垃圾字符。 Parsing byte array containg fields of unknown length 下的最后一个响应建议遍历数组并手动查找空终止字符,但我想知道 String 构造函数是否会自动执行此操作。我还假设系统的默认字符集将用于所有端。

【问题讨论】:

    标签: java string character-encoding bytearray


    【解决方案1】:
    byte arr[] = ...
    Charset charset = ...
    
    // Find the position of the first zero byte
    int i;
    for (i = 0; i < arr.length && arr[i] != 0; i++) { }
    
    
    String str = new String(arr, 0, i, charSet);
    

    注意事项:

    • 使用显式 CharSet 参数通常是个好主意,这样您的应用程序就不会依赖于平台的默认字符集/编码。

    • 这不适用于某些字符集。例如,UTF-16 编码的字符串不能安全地表示为以零结尾的字节序列,因为许多代码单元包含零字节。 (另一方面,如果字符串不包含代码点零的实例,则 UTF-8 是可以的;请参阅Can UTF-8 contain zero byte?

    ...但我想知道 String 构造函数是否会自动执行此操作。

    不/他们不会。 (不要“怀疑”...阅读 javadoc :-))

    我还假设系统的默认字符集将用于所有端。

    如果不指定字符集,将使用 Java 平台的默认值。这可能是系统的默认值,但不能保证。

    【讨论】:

      【解决方案2】:

      这个怎么样:

      String str = new String(arr).split("\0")[0];
      

      【讨论】:

      • 如果输入数组很大,看起来不太好,除非你要读取所有字符串。
      • 这是对默认字符集的假设。它正在创建一个大的临时字符串,一个数组,可能是第一个 null 之后的东西的大量不必要的字符串。
      【解决方案3】:

      试试这个: String s = new String(arr).trim()

      【讨论】:

      • trim() 可以很好地删除字符串末尾的空字符...
      • trim() 仅在数组末尾的所有字符都为零时才有效(例如 [65, 66, 67, 0, 0, 0]:这将转换为“ABC”)但不是终止符后带有垃圾字符(例如 [65, 66 ,67, 0, -12, 10 , 33])。
      【解决方案4】:

      它不会神奇地停在空终止符处。空字符不会终止 Java 中的字符串。您必须找到第一个空字符的索引并停在那里。之后使用String(byte[] arr, int offset, length) 构造函数。

      【讨论】:

      • NULL 字符不一定在数组的末尾;它可以在任何位置。
      • @Phillip,在再次阅读您的问题后意识到这一点.. 编辑了我的答案
      猜你喜欢
      • 2019-05-09
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2013-12-19
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多