gpt4 book ai didi

java - ASCII 中的六个不同的 '?' 字符?

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:38 24 4
gpt4 key购买 nike

我编写了一个读取 GameBoy 车的 Arduino 程序,Java 向它发送一个字符来启动,它开始读取并发送回字节。在十六进制编辑器(甚至文本编辑器)中打开转储的 ROM 乍一看显示它们是相同的,在编辑器中使用比较功能后,它突出显示转储的 ROM 中的所有 0x3F 字符都是不正确的 - 只有它们不正确。在执行此操作之前,我的 Arduino 程序的每个功能都已经过测试,所以我唯一能想到的就是测试 Java 端。为了测试这一点,我简单地制作了另一个简单的 Arduino 程序,该程序通过串行方式将每个 ASCII 字符 (0-255) 发送到其十进制数旁边。我意识到实际上有六种不同的?字符,这是文件的那些部分:

59: ;
60: <
61: =
62: >
63: ? <
64: @
65: A
66: B
...
125: }
126: ~
127:
128: €
129: ? <
130: ‚
131: ƒ
132: „
...
140: Œ
141: ? <
142: Ž
143: ? <
144: ? <
145: ‘
146: ’
147: “
...
154: š
155: ›
156: œ
157: ? <
158: ž
159: Ÿ
160:  

这里是有问题的 Java 代码:

final Arduino board = new Arduino("COM5", 115200);
BufferedWriter rom = new BufferedWriter(new FileWriter("[ROM].gb"));
board.write((byte)0);
Thread.sleep(10000);
while (board.hasavailable() > 0) {
String data = new String(board.read(board.hasavailable()));
rom.write(data);
Thread.sleep(1000);
}
rom.flush();
rom.close();

我看不出这是一个通信问题,就好像波特率错误一样,它会是垃圾,如果这是一个文本格式问题,例如 UTF-8 到 ASCII,当然也会出现同样的情况......基本上,Java 一定会与“?”混淆。角色并始终假设它是第一个实例。当我将 byte[] 转换为字符串时,我是否遗漏了一些东西,因为这似乎是按照我的方式执行此操作的一个明显问题。

编辑1:

我一直使用 asciitable.com 作为引用,以使所有字符都相同。

我还发现,如果我将文件写入代码更改为:

byte[] data = board.read(readsize);
for (byte in : data)
rom.write(in);

所有扩展集(128+)都变成“?”。难道是 bufferedWriter 的问题吗?

编辑 2:可重现的示例

这是我正在使用的 Arduino 和 Java 代码。

http://pastebin.com/Tijjdb0A

Java写完文件后,用十六进制编辑器查看,上面的字符都变成了0x3F。

最佳答案

我认为问题在于您正在将原始数据从字节转换为字符串,然后仅将字符串写入缓冲写入器。当您调用 new String(byte[]) 时,根据文档

Constructs a new String by decoding the specified array of bytes using the platform's default charset.

这意味着它会获取您的字节,假设它是您机器上默认字符集的字符串,然后将其转换为 UTF-16,这是 Java 中字符串的内部表示形式。在许多平台上,“默认字符集”表示 UTF-8,并且在 UTF-8 中,“扩展 ASCII”的大多数字节(即 128 及更高字节)是较长字符的一部分,占用多个字节。您的字节可能不是有效的 UTF-8 字符串,因此某些字符会被损坏。

我认为,如果您直接将字节写入文件,而不是先创建一个字符串,即使用 BufferedOutputStream(FileOutputStream) ,而不是 BufferedWriter(FileWriter) ,一切都会没事。

关于java - ASCII 中的六个不同的 '?' 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24209407/

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