Я пытаюсь прочитать данные из mp3-файла, чтобы впоследствии ими можно было манипулировать как шестнадцатеричными.Предположим, если я открыл mp3-файл в текстовом редакторе и увидел символы ÿû²d
.Перевод должен читать FF FB B2 64
в шестнадцатеричном (с указанием заголовка).Однако шестнадцатеричный код, который отображается в выходном текстовом файле, равен 6E 75 6C 6C
, и я не могу понять, почему.
Источники:
Java-код Для преобразования байта в шестнадцатеричный
конвертировать аудио, mp3-файл в строку и наоборот
Как проверить кодировку строки в Java?
Myкод:
package mp3ToHex;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.*;
public class mp3ToHex {
public static void main(String[] args) {
//directories
String fileIn = "Some\\Input\\Directory.mp3", fileOut = "Some\\Output\\Directory.txt";
outputData(fileOut, fileIn);
}
@SuppressWarnings("unused")
public static String readFile(String filename) {
// variable representing a line of data in the mp3 file
String line = "";
try {
BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
while (br.readLine() != null) {
line += br.readLine();
try {
if (br == null) {
// close reader when all data is read
br.close();
}
} catch (FileNotFoundException e) {
e.getMessage();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
e.getMessage();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
public static void outputData(String outputFile, String inputFile) {
try {
// Create file
FileWriter fileStream = new FileWriter(outputFile);
BufferedWriter writer = new BufferedWriter(fileStream);
// Convert string to hexadecimal
String output = toHex(readFile(inputFile));
StringBuilder s = new StringBuilder();
for (int i = 0; i < output.length(); i++) {
// Format for easier reading
if (i % 64 == 0) s.append('\n');
else if (i % 2 == 0) s.append(' ');
s.append(output.charAt(i));
}
// Write to file
writer.write(s.toString());
// Close writer
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// Converts strings to hexadecimal
public static String toHex(String arg) throws UnsupportedEncodingException {
return String.format("%02X", new BigInteger(1, arg.getBytes(charset(arg, new String[] {
"US-ASCII",
"ISO-8859-1",
"UTF-8",
"UTF-16BE",
"UTF-16LE",
"UTF-16"
}))));
}
// Converts strings to different encodings
public static String convert(String value, String fromEncoding, String toEncoding) throws UnsupportedEncodingException {
return new String(value.getBytes(fromEncoding), toEncoding);
}
// Detects which Charset a string is encoded in by decoding and re-encoding a string. The correct encoding is found if the transformation yields no changes.
public static String charset(String value, String charsets[]) throws UnsupportedEncodingException {
String probe = StandardCharsets.UTF_8.name();
for (String c: charsets) {
Charset charset = Charset.forName(c);
if (charset != null) {
if (value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) {
return c;
}
}
}
return StandardCharsets.UTF_8.name();
}
}