从文件中读取字节值,ASCII和UTF-16字符
我试图从mp3文件中读取ID3v2.3.0标签,并且这些值是混合类型。从文件中读取字节值,ASCII和UTF-16字符
例如,文件将以3个字符“ID3”开头,后跟两个版本字节的值3和0,标签的各个帧由4个ASCII字符标识符组成,后跟两个标志字节,然后是4个字节的字节,然后将(文本)帧的内容作为UTF-16字符串。 example ID3 file
在Java中,我不是那么熟悉和有文件阅读课的很多,可能我用这将是最舒服的在这种情况下一起工作呢?为了澄清,我希望能够读取(无符号)字节值,ASCII字符数组和UTF-16字符数组(理想情况下来自同一个流/通道/读取器对象,或者至少不必关闭一个字符串,创建另一个并跳到我的最后一个位置),并且我希望避免尽可能多的单字节投射。
此刻我正在使用DataInputStream,因为它允许我读取无符号字节值和有符号字节数组。
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()也是这样。由于标题*会*告诉我字符串有多长,以及它们被编码的方式,这很好地工作! – melak47 2011-12-26 16:47:29