我正在使用串口,在8位数据上向某些硬件发送和接收数据。我想将它存储为字符串以方便比较,并且预设数据以字符串或十六进制格式存储在xml文件中。我发现只有在使用ANSI编码的Encoding.Default时,8位数据才能正确转换并且易于翻转。 ASCII编码仅适用于7位数据,而UTF8或UTF7也不适用,因为我使用的是1-255的一些字符。 Encoding.Default会很好,但我在MSDN上读到它依赖于操作系统代码页设置,这意味着它可能在配置的不同代码页上表现不同。我使用Encoding广泛使用GetBytes()和GetString,但希望能够在任何配置下始终工作的故障安全和可移植方法。任何想法或更好的建议呢?.Net 8位编码
4
A
回答
13
的Latin-1又名ISO-8859-1又名代码页28591是这种情况下有用的代码页,因为它映射在128-255范围内不变的值。以下是可以互换:
Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("iso-8859-1")
下面的代码说明了为Latin1的,不像Encoding.Default,在0-255范围内的所有字符被映射不变的事实:
static void Main(string[] args)
{
Console.WriteLine("Test Default Encoding returned {0}", TestEncoding(Encoding.Default));
Console.WriteLine("Test Latin1 Encoding returned {0}", TestEncoding(Encoding.GetEncoding("Latin1")));
Console.ReadLine();
return;
}
private static bool CompareBytes(char[] chars, byte[] bytes)
{
bool result = true;
if (chars.Length != bytes.Length)
{
Console.WriteLine("Length mismatch {0} bytes and {1} chars" + bytes.Length, chars.Length);
return false;
}
for (int i = 0; i < chars.Length; i++)
{
int charValue = (int)chars[i];
if (charValue != (int)bytes[i])
{
Console.WriteLine("Byte at index {0} value {1:X4} does not match char {2:X4}", i, (int) bytes[i], charValue);
result = false;
}
}
return result;
}
private static bool TestEncoding(Encoding encoding)
{
byte[] inputBytes = new byte[256];
for (int i = 0; i < 256; i++)
{
inputBytes[i] = (byte) i;
}
char[] outputChars = encoding.GetChars(inputBytes);
Console.WriteLine("Comparing input bytes and output chars");
if (!CompareBytes(outputChars, inputBytes)) return false;
byte[] outputBytes = encoding.GetBytes(outputChars);
Console.WriteLine("Comparing output bytes and output chars");
if (!CompareBytes(outputChars, outputBytes)) return false;
return true;
}
串行
9
为什么不直接使用字节数组呢?使用文本方法可能会遇到的任何编码问题都没有。
-2
您可以使用base64编码将字节转换为字符串并返回。代码页或奇怪的字符没有问题,它会比十六进制更节省空间。
byte[] toEncode;
string encoded = System.Convert.ToBase64String(toEncode);
+0
-1一起使用:base64如何提供帮助? – Joe 2008-09-21 17:59:42
1
使用Windows-1255的希伯来语代码页。它的8位。
Encoding enc = Encoding.GetEncoding(“windows-1255”);
我missunderstod你,当你写了“1-255”,还以为你在哪里代码页1255
2
refereing字符我认为你应该使用一个字节数组来代替。为了便于比较,你可以使用一些方法是这样的:
static bool CompareRange(byte[] a, byte[] b, int index, int count)
{
bool res = true;
for(int i = index; i < index + count; i++)
{
res &= a[i] == b[i];
}
return res;
}
相关问题
- 1. PHPMailer编码8位
- 2. 解码8位邮件消息:内容传输编码:8位
- 3. 8位PCMU编码器/解码器
- 4. GSM的8位数据编码
- 5. 8位编码文件写入?
- 6. 针对飞镖的ASCII-8位编码
- 7. 以8位浮点编码数据(cg)
- 8. 差异的charset =“UTF-8”和内容传输编码:8位
- 9. 百分比编码UTF-8到Ascii(8位)转换
- 10. python将12位图像编码为字符串到8位png
- 11. IMAP - UTF-8编码
- 12. SOAP UTF-8编码
- 13. HtmlAgilityPack UTF-8编码
- 14. HttpServletRequest UTF-8编码
- 15. MySQL UTF-8编码
- 16. PHP编码 - UTF-8
- 17. BeautifulSoup“编码(” UTF-8" )
- 18. JBoss编码utf 8
- 19. HTML UTF-8编码
- 20. UTF-8 URL解码/编码
- 21. SerialPort编码 - 我如何获得8位ASCII码?
- 22. 空字符解码ASCII 8位编码文件
- 23. 7位和8位编码信息必须在输出前解码吗?
- 24. 如何在C#.Net中获得CSV文件编码UTF-8?
- 25. 8位二进制代码
- 26. 4位乘以8位汇编乘法
- 27. 协作编码 - .NET
- 28. .NET内部编码
- 29. 在线.Net编码
- 30. XML解析:编码UTF-8&UTF-8
有时I/o你想发送穿插有控制字符的文本字符串。如果您使用字符串,则更易于阅读。 – Joe 2008-09-21 17:55:48
@Joe:尽管你总是可以使用ASCIIEncoding来检索字节的字节。 – user7116 2008-09-21 17:58:12
ASCIIEncoding仅适用于1-127的较低范围。 – faulty 2008-09-22 02:08:10