Fixed an issue when looking for termination string in UTF-16 and UTF-16BE

Modified parse method to take into account different lengths for the
termination character (1 for UTF-8 and ISO-8859-1; 2 for UTF-16 and
UTF-16BE).
This commit is contained in:
J. Oliva 2015-02-27 10:57:43 +01:00
parent c135bb7a57
commit f33cdd97e6

View File

@ -67,7 +67,7 @@ public class Id3Parser implements MetadataParser<Map<String, Object>> {
int firstZeroIndex = indexOfEOS(frame, 0, encoding); int firstZeroIndex = indexOfEOS(frame, 0, encoding);
String description = new String(frame, 0, firstZeroIndex, charset); String description = new String(frame, 0, firstZeroIndex, charset);
int valueStartIndex = firstZeroIndex + 1; int valueStartIndex = firstZeroIndex + delimiterLength(encoding);
int valueEndIndex = indexOfEOS(frame, valueStartIndex, encoding); int valueEndIndex = indexOfEOS(frame, valueStartIndex, encoding);
String value = new String(frame, valueStartIndex, valueEndIndex - valueStartIndex, String value = new String(frame, valueStartIndex, valueEndIndex - valueStartIndex,
charset); charset);
@ -91,17 +91,17 @@ public class Id3Parser implements MetadataParser<Map<String, Object>> {
int firstZeroIndex = indexOf(frame, 0, (byte) 0); int firstZeroIndex = indexOf(frame, 0, (byte) 0);
String mimeType = new String(frame, 0, firstZeroIndex, "ISO-8859-1"); String mimeType = new String(frame, 0, firstZeroIndex, "ISO-8859-1");
int filenameStartIndex = firstZeroIndex + 1; int filenameStartIndex = firstZeroIndex + delimiterLength(encoding);
int filenameEndIndex = indexOfEOS(frame, filenameStartIndex, encoding); int filenameEndIndex = indexOfEOS(frame, filenameStartIndex, encoding);
String filename = new String(frame, filenameStartIndex, String filename = new String(frame, filenameStartIndex,
filenameEndIndex - filenameStartIndex, charset); filenameEndIndex - filenameStartIndex, charset);
int descriptionStartIndex = filenameEndIndex + 1; int descriptionStartIndex = filenameEndIndex + delimiterLength(encoding);
int descriptionEndIndex = indexOfEOS(frame, descriptionStartIndex, encoding); int descriptionEndIndex = indexOfEOS(frame, descriptionStartIndex, encoding);
String description = new String(frame, descriptionStartIndex, String description = new String(frame, descriptionStartIndex,
descriptionEndIndex - descriptionStartIndex, charset); descriptionEndIndex - descriptionStartIndex, charset);
byte[] objectData = new byte[frameSize - descriptionEndIndex - 2]; byte[] objectData = new byte[frameSize - descriptionEndIndex - 2];
System.arraycopy(frame, descriptionEndIndex + 1, objectData, 0, System.arraycopy(frame, descriptionEndIndex + delimiterLength(encoding), objectData, 0,
frameSize - descriptionEndIndex - 2); frameSize - descriptionEndIndex - 2);
metadata.put(GeobMetadata.TYPE, new GeobMetadata(mimeType, filename, metadata.put(GeobMetadata.TYPE, new GeobMetadata(mimeType, filename,
description, objectData)); description, objectData));
@ -147,7 +147,7 @@ public class Id3Parser implements MetadataParser<Map<String, Object>> {
// Otherwise, look for a two zero bytes // Otherwise, look for a two zero bytes
while(terminationPos < data.length - 1) { while(terminationPos < data.length - 1) {
if(data[terminationPos + 1] == (byte) 0) { if(data[terminationPos + 1] == (byte) 0) {
return terminationPos + 1; return terminationPos;
} }
terminationPos = indexOf(data, terminationPos + 1, (byte) 0); terminationPos = indexOf(data, terminationPos + 1, (byte) 0);
} }
@ -155,6 +155,11 @@ public class Id3Parser implements MetadataParser<Map<String, Object>> {
return data.length; return data.length;
} }
private static int delimiterLength(int encodingByte) {
return (encodingByte == ID3_TEXT_ENCODING_ISO_8859_1 ||
encodingByte == ID3_TEXT_ENCODING_UTF_8) ? 1 : 2;
}
/** /**
* Parses an ID3 header. * Parses an ID3 header.
* *