从一个字节文件读取返回0xEF 0xBF 0xBD

时间:2014-05-20 19:27:53

标签: java byte fileinputstream

解决了,接受了以下答案,因为它指出我检查我的文件是如何损坏的。请阅读Maven理由的结尾。

我创建了一个包含字节0xA8的1字节文件。我试图将它读入任何允许我稍后使用它的Java结构中。我知道java中的字节是有符号的,因此从0x800xFF的任何值都将被解释为负数。

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void main(final String[] args) throws IOException {
        // 0xA8.hex contains one byte 0xA8.
        final File inputFile = new File(Test.class.getClassLoader().getResource("0xA8.hex").getPath());
        final FileInputStream fin = new FileInputStream(inputFile);
        final DataInputStream dis = new DataInputStream(fin);
        int read = dis.readUnsignedByte();
        System.out.println(read + ", hex: " + Integer.toHexString(read));

        while (true) {
            try {
                read = dis.readUnsignedByte();
                System.out.println("read more: " + read + ", hex: " + Integer.toHexString(read));
            } catch (final EOFException ignored) {
                break;
            }
        }
    }
}

可能有一些真的简单,我很遗憾,但我无法绕过它。上面的程序输出:

239, hex: ef
read more: 191, hex: bf
read more: 189, hex: bd

0xA8.hex文件是我使用十六进制编辑器自己创建的1字节文件。它的内容实际上是一个字节:

drvdijk@macmine:~/$ hexdump 0xA8.hex 
0000000 a8                                             
0000001

为什么,以及如何让它只读一个(可能转换为无符号)字节?

解决方案

我使用Maven,在pom.xml我有一个部分:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <!-- ... -->
</build>

我使用的0xA8.hex文件被Maven过滤,输入了替换字符(0xEF 0xBF 0xBD),其中0xA8曾经是。pom.xml。我现在将<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>**/*.hex</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>**/*.hex</include> </includes> </resource> </resources> <!-- ... --> </build> 更新为以下内容:

{{1}}

1 个答案:

答案 0 :(得分:1)

您的文件似乎有替换字符http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec

U+FFFD  �   239 191 189 REPLACEMENT CHARACTER

不是0xA8,我确实使用以下代码创建了一个简单文件

File f = new File("0xA8.hex");
        FileOutputStream stream = new FileOutputStream(f);
        stream.write(0xA8);
        stream.flush();
        stream.close();

注意**仅适用于演示

并使用您的程序读取它正在作为例外工作。找出文件是如何损坏的。