2010-09-02 23 views
1

无符号字符问题。 我正在读取具有ASCII /扩展ASCII数据的PPM图像文件。转换C/C++无符号字符到JAVA的问题

对于一个字符,例如。 “†”, 在JAVA,读取它作为char和类型转换转换成int其值后是8224 在C/C++,读它作为一个无符号字符和类型转换转换成int其值后是160

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

的followng 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^ 102f也 台112p 119瓦特 126〜 196 Ä 122ž 197埃 197埃

任何帮助理解

回答

4

在C++中,您正在使用某些特定编码中的“窄”字符来定义字符'†'为160.在其他编码中,160可能意味着其他编码,字符'†'可能完全丢失。

在Java中,你总是处理Unicode。 8660 = 0x2020 = U + 2020“DAGGER”。

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

+0

感谢atzz,这是很好的解释。 我现在试图弄清楚在C++中使用charset的方式 谢谢!:) – metalhawk 2010-09-02 20:57:10

+1

@ ravikumar1:试试US-ASCII。如果这不起作用,请尝试ISO-8859-1。 – Powerlord 2010-09-02 21:04:05

+0

谢谢Bemrose。我写了一个小的fn来获取字符集。我发现-96的命中(256-96 = 160)。谢谢大家的支持。 :)下面是我的测试fn: – metalhawk 2010-09-02 21:24:52

0

IIRC Java对字符使用16位表示法(UNICODE?),C++通常不会使用wchar。

我认为你最好是让C++使用Java使用的UNICODE字符而不是其他方式。

+0

嗨Timo, 感谢您的及时回复。 我正在尝试在JAVA中编写我的应用程序。所以我需要一种方法从char†中获得160。 :( – metalhawk 2010-09-02 20:38:42

+0

“UNICODE?”UTF-16更精确 – Powerlord 2010-09-02 21:01:55

0

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

+0

感谢Peter,我只想用JAVA编写。我没有一个首先运行的C++程序。简单地说,我只用JAVA解码,为此我需要160个char† – metalhawk 2010-09-02 20:59:14