.Net 8位编码 [英] .Net 8-bit Encoding

查看:78
本文介绍了.Net 8位编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在串行端口发送和接收数据到一些硬件8位数据。我想将其存储为字符串以方便比较,预设数据以xml文件形式存储为字符串或十六进制格式。我发现只有当使用ANSI编码的Encoding.Default时,8位数据才能被正确转换并且很容易被逆转。 ASCII编码仅适用于7位数据,UTF8或UTF7也不能正常工作,因为我在1-255中使用了一些字符。 Encoding.Default将会很好,但是我在MSDN上阅读它取决于操作系统代码页设置,这意味着它可能在配置的不同代码页上的行为有所不同。我使用GetBytes()和GetString广泛使用编码,但是想要一个故障安全和便携式的方法,所有的时间在任何配置。任何想法或更好的建议?

解决方案

拉丁语1也称为ISO-8859-1 aka codepage 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) ;
返回false;
}
for(int i = 0; i< chars.Length; i ++)
{
int charValue =(int)chars [i];
if(charValue!=(int)bytes [i])
{
Console.WriteLine(索引{0}的字节值{1:X4}与char {2: X4},i,(int)bytes [i],charValue);
result = false;
}
}
返回结果;
}
private static bool TestEncoding(Encoding encoding)
{
byte [] inputBytes = new byte [256]; (int i = 0; i <256; i ++)
{
inputBytes [i] =(byte)i;
}

char [] outputChars = encoding.GetChars(inputBytes);
Console.WriteLine(比较输入字节和输出字符);
if(!CompareBytes(outputChars,inputBytes))return false;

byte [] outputBytes = encoding.GetBytes(outputChars);
Console.WriteLine(比较输出字节和输出字符);
if(!CompareBytes(outputChars,outputBytes))return false;

返回true;
}


I'm working on serial port, transmitting and receiving data to some hardware at 8bit data. I would like to store it as string to facilitate comparison, and preset data are stored as string or hex format in xml file. I found out that only when using Encoding.Default which is ANSI encoding then the 8bit data is converted properly and easily reversible. ASCII encoding will only works for 7bit data, and UTF8 or UTF7 doesn't works well too, since I'm using some character from 1-255. Encoding.Default would be just fine, but I read on MSDN that it's dependent on OS codepage setting, which means it might behave differently on different codepage configured. I use GetBytes() and GetString extensively using the Encoding, but would like a failsafe and portable method that works all the time at any configuration. Any idea or better suggestion for this?

解决方案

Latin-1 aka ISO-8859-1 aka codepage 28591 is a useful codepage for this scenario, as it maps values in the range 128-255 unchanged. The following are interchangeable:

Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("iso-8859-1")

The following code illustrates the fact that for Latin1, unlike Encoding.Default, all characters in the range 0-255 are mapped unchanged:

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;
}

这篇关于.Net 8位编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆