需要帮助从文件中读取字节(返回的字节不正确)

时间:2016-05-16 21:00:50

标签: java arrays byte mp3 id3

我正在尝试创建一个简单的程序来编辑MP3标签。但问题是我卡在第一步,因为我甚至无法将文件字节传递到字节数组。技术上我可以,但他们错了

例如,如果我将字节复制到txt文件并打开它,大部分文本都是乱码,包括标签(后面会出现问题),但第一个字母是ID3,这是正确的。

但是如果我在控制台中打印由mp3产生的字节数组,则第一个值为

1001001 1000100 110011 11 0 0 ..... 哪些都是无效字符。但是在第一行之前加零,在第二行之前加零,在第三行之前加两个零,现在说是ID3

什么会导致零丢失?每个mp3文件都是一样的。请提前感谢您的帮助

这段代码是一个非常简单的副本

尝试{

            FileInputStream BF1 = new FileInputStream("test.mp3");
            FileOutputStream fout = new FileOutputStream("byteresults.txt");
            byte[] tempbyte = new byte[1024];
            BF1.read(tempbyte);
            BF1.close();





             int i;
             for(i=0;i<900;i++){
             System.out.print(Integer.toBinaryString(tempbyte[i])+'\n');}



        } catch(FileNotFoundException fnf)
        {
                System.out.println("Specified file not found :" + fnf);
        }
        catch(IOException ioe)
        {
                System.out.println("Error while copying file :" + ioe);
        }

1 个答案:

答案 0 :(得分:0)

打印二进制格式时,大多数系统会丢弃前导零,因为它们不会影响最终值。您只需要8个数字作为字节,但二进制计数本身不能像那样工作。它不关心8个插槽或4个插槽等。考虑3被写为二进制11,所以为什么打扰那个00000011?为什么不0011 ??无论如何,人类读者都会忽略那些领先的零。

也许您可以尝试Hex格式,因为它更容易(=效率更高)。类似的东西:

for ( i=0; i<900; i++)
{
    //System.out.print(Integer.toBinaryString(tempbyte[i])+'\n');
    System.out.printf("0x%02X", tempbyte[i]);
}

这样您甚至可以根据某些Hex Editor软件检查输出(处理完全相同的文件字节)。更容易检查您在正确的位置使用正确的值等正确的字节...