【问题标题】:Read byte values, ASCII and UTF-16 chars from file从文件中读取字节值、ASCII 和 UTF-16 字符
【发布时间】:2011-12-26 10:06:51
【问题描述】:

我正在尝试从 mp3 文件中读取 ID3v2.3.0 标签,并且值是混合类型的。

例如,文件将以 3 个字符“ID3”开头,后跟两个版本字节,值为 3 和 0,标签的各个帧由 4 个 ASCII 字符标识符组成,后跟两个标志字节,然后是 4 个大小字节,然后是(文本)帧的内容作为 UTF-16 字符串。 example ID3 file

我不是很精通 java,并且有 很多 文件读取类,在这种情况下我可以使用哪个最适合使用?

为了澄清,我希望能够读取(无符号)字节值、ASCII 字符数组和 UTF-16 字符数组(理想情况下来自同一个流/通道/读取器对象,或者至少不必关闭一个,创建另一个并跳到我的最后一个位置),我想尽可能避免单字节转换。

目前我正在使用 DataInputStream,因为它允许我读取无符号字节值和有符号字节数组。

【问题讨论】:

    标签: java java-6


    【解决方案1】:

    Java 没有无符号字节,但是您可以将它们读取为有符号字节,并且大多数时候它应该是绝对没问题的 - 如果您需要将它们视为整数值(而不仅仅是位存储桶),您可以使用:

    int intValue = byteValue & 0xff;
    

    有效地将它们视为无符号值。

    至于文本部分:这取决于您了解存储的文本数据量的难易程度。在理想情况下,会有某种标头值表示文本数据有多少字节。在这种情况下,您可以将这么多数据读入一个字节数组,然后使用:

    String text = new String(data, encoding);
    

    在这种情况下,encoding 是“US-ASCII”或“UTF-16BE”或“UTF-16LE”(您需要确定它是 UTF-16 的哪种字节序 - 从您的示例来看,它看起来像应该是 UTF-16LE)。

    从示例文件中不清楚是否格式是否包含该信息 - 如果它只是一个以 NUL 结尾的字符串,它会稍微尴尬一些; ASCII 和 UTF-16 在这方面处理起来都不是特别棘手,但从根本上说,必须随心所欲地解码。

    【讨论】:

    • 谢谢!我知道如何获得这样的无符号字节值,但 DataInputStream.readUnsignedByte() 也是如此。由于标头 do 告诉我字符串有多长,以及它们的编码方式,所以效果很好!
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2016-07-02
    • 2015-07-26
    • 2011-10-23
    • 1970-01-01
    • 2017-09-06
    • 2013-03-01
    • 2012-05-09
    相关资源
    最近更新 更多