将 C/C++ 无符号字符转换为 JAVA 时出现问题

Posted

技术标签:

【中文标题】将 C/C++ 无符号字符转换为 JAVA 时出现问题【英文标题】:Problem converting C/C++ unsigned char to JAVA 【发布时间】:2010-09-02 20:29:52 【问题描述】:

无符号字符的问题。 我正在阅读一个 PPM 图像文件,其中包含 ASCII/扩展 ASCII 数据。

对于一个字符,例如。 '†' , 在 JAVA 中,将其读取为 char 并将其类型转换为 int 后,其值为 8224。 在 C/C++ 中,将其读取为 unsigned char 并将其类型转换为 int 后,其值为 160。

我将如何阅读 JAVA 以获得价值 160 ?

接下来的 C++

unsigned char ch1 ='†';  
char ch2 = '†';  

cout << (int) ch1 << "\n"; // prints 160  
cout << (int) ch2 << "\n"; // prints -96  

在 Java 中,

char ch1 = '^';  
char ch2 = '†';  
System.out.println (" value : " +  (int) ch1); // prints 94  
System.out.println (" value :" +  (byte) ch1); // prints 94  

System.out.println (" value : " +  (int) ch2); // prints 8224  
System.out.println (" value :" +  (byte) ch2); // prints 32 

以下是一些例外情况 8224 † 8226 • 8800≠ 8482™ 8710 Δ 8211 – 8221” 8216‘ 9674◊ 8260 ⁄ 8249 ‹ 8249 ‹ 8734 ∞ 8747 ∫ 8364 欧元 8730 √ 8804 ≤

以下是一些不错的 94 ^ 102 英尺 112 人 119 瓦 126~ 第196章 122z 197 埃 第197章

感谢任何帮助

【问题讨论】:

【参考方案1】:

在 C++ 中,您在某些特定编码中使用“窄”字符,恰好将字符 '†' 定义为 160。在其他编码中,160 可能意味着其他内容,而字符 '†' 可能完全丢失。

在 Java 中,您总是在处理 Unicode。 8660 = 0x2020 = U+2020 “匕首”。

要获得“160”,您需要将字符串转换为与 C++ 相同的编码。见String.getBytes(charset)。

【讨论】:

感谢 atzz,这是很好的解释。我现在正在尝试获取 C++ 中使用的字符集。谢谢 ! :) @ravikumar1:试试 US-ASCII。如果这不起作用,请尝试 ISO-8859-1。 谢谢贝姆罗斯。我写了一个小 fn 来获取字符集。我找到了 -96 (256-96=160) 的命中率。谢谢大家的支持。 :) 下面是我的测试 fn: 这里是。 public void findCharsets() Map charSets = Charset.availableCharsets();迭代器它 = charSets.keySet().iterator();字符串 str = Character.toString('†'); while (it.hasNext()) try String csName = (String) it.next();字节 b[] = str.getBytes(Charset.forName(csName)); if (b[0] == -96) System.out.println("找到:" + csName); catch (Exception e) // 什么也不做;转到下一个字符集 这是程序的输出 Found: MacRoman Found: x-MacCentralEurope Found: x-MacCroatian Found: x-MacCyrillic Found: x-MacGreek Found: x-MacRomania Found: x-MacTurkish Found: x-Mac乌克兰【参考方案2】:

IIRC Java 使用 16 位表示字符(UNICODE?),而 C++ 通常不使用,除非您使用 wchars。

我认为你最好尝试让 C++ 使用 Java 使用的 UNICODE 字符,而不是相反。

【讨论】:

您好 Timo,感谢您的及时回复。我正在尝试用 JAVA 编写我的应用程序。所以我需要一种从 char † 中取出 160 的方法。 :( "UNICODE?"更准确地说是 UTF-16。【参考方案3】:

如果您在 C++ 中将 unsigned char 160 写为单个字节,并使用 InputStream.read() 将得到 160。这意味着哪个字符取决于假定的编码,但值 160 不变。

【讨论】:

谢谢彼得,我正在尝试只用 JAVA 编写。我没有首先运行的 C++ 程序。简单地说,我只用 JAVA 解码,为此我需要 160 用于 char †

以上是关于将 C/C++ 无符号字符转换为 JAVA 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

[C/C++笔面试]不使用库函数将整数转换为字符串

创建 Java 实用函数以将无符号字符数组转换为字符串

将 Long/ULong 转换为带有填充零的无符号十六进制字符串

将“无符号字符”数组转换为“无符号短”数组的有效方法是啥?

[C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]

[C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]