2011-08-18 59 views
2

我知道我收到来自串行端口(一个了u-blox GPS设备)以字节格式的一些数据,也应该是这样的:C#的SerialPort编码转换为byte []

Hex:  0xB5 0x62 0x01 0x21 
ISO 8859-1: µ b 1 ! 

所以我读了在命令行字符串s和一个文本框打印,它看起来像:

Tbx:  ? b  ! 

这似乎很好,因为文本框未配置尊重编码。

当我尝试将字符串s转换为字节(这看起来应该像第一个十六进制线),我得到

Bytes(d): 63 98 1 33 
Bytes(h): 0x3F 0x62 0x1 0x21 

正如你看到的,μ焦炭是错误的编码,某处沿着我办法。 这里是代码:

string s = port.ReadLine(); 
System.Text.Encoding iso_8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1"); 
System.Text.Encoding ascii = port.Encoding; 

byte[] bASCII = ascii.GetBytes(s); 
byte[] bICO = Encoding.Convert(ascii, iso_8859_1, bASCII); 

我在哪里搞μμ?

+0

是没可能使用二进制'读(字节[],INT,INT)'方法,而忘记了编码? –

+0

使用unicode而不是iso-8859-1 – Jaster

+0

@Marc Graell:并不是真的,因为我收到很多其他ASCII消息(NMEA)中的消息,我将其转发给其他设备。所以我会再次担心编码,只是在不同的地方。 (a)Jaster:既不工作也不工作。 – buhlara

回答

0

我相信0x3F字符实际上是一个问号。

尝试设置 port.Encoding到Encoding.ASCII。在之前设置此值调用port.ReadLine();

否则,您可能需要读取原始字节并查找\ r或\ n。

+0

尝试将端口设置为ASCII(虽然它已经是ASCII),但没有改变任何东西。 – buhlara

4

试试这个

System.Text.Encoding iso_8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1"); 
port.Encoding = iso_8859_1; 

string s = port.ReadLine(); 

byte[] theBytes = iso_8859_1.GetBytes(s); 
+0

我遇到了这个确切的问题,这确实是解决方案。这应该是被接受的答案。 – Miebster

+0

我原来的评论一年后,我用不同的硬件再次遇到了这个问题。这个答案仍然是解决方案。 – Miebster