我正在尝试从mp3文件中读取ID3v2.3.0标记,并且值是混合类型。
例如,文件将以3个字符“ID3”开头,后跟两个版本字节值3和0,标签的各个帧由4个ASCII字符标识符组成,后跟两个标志字节,然后是4个大小的字节,然后将(文本)帧的内容作为UTF-16字符串。 example ID3 file
我不是那些精通java的人,并且有很多的文件阅读类,我可以使用哪种方法在这种情况下最舒服?
为了澄清,我希望能够读取(无符号)字节值,ASCII字符数组和UTF-16字符数组(理想情况下来自相同的流/通道/读取器对象,或者至少不必关闭一个,创建另一个,跳到我的最后一个位置),我想避免尽可能多的单字节转换。
目前我正在使用DataInputStream,因为它允许我读取无符号字节值和带符号字节数组。
答案 0 :(得分:2)
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都不是特别难以处理,但从根本上说,你不必解码就好了。