将 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 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
将 Long/ULong 转换为带有填充零的无符号十六进制字符串