gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:57:24 28 4
gpt4 key购买 nike

已解决,接受下面的答案,因为它指出我检查我的文件是如何损坏的。请阅读此问题的结尾以了解 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 过滤,在我的 0xA8 原来的位置输入替换字符 (0xEF 0xBF 0xBD)。我现在将 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>

最佳答案

您的文件似乎有替换字符 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();

注意**仅供演示

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

关于java - 从一字节文件读取返回 0xEF 0xBF 0xBD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768328/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com