如何将字符串转换为偶数奇偶校验的7位ASCII?

时间:2012-03-30 11:12:44

标签: c# .net

我需要在与大型机通信的C#应用​​程序中将字符串转换为具有偶校验的7位ASCII。我尝试使用Encoding.ASCII,但它没有正确的奇偶校验。

3 个答案:

答案 0 :(得分:2)

您必须自己计算奇偶校验位。所以:

  1. 使用内置的8位ASCII编码将字符串转换为字节数组。使用此编码,大多数顶部位应始终为0。
  2. 对每个字节进行位修改,并为每个字节设置奇偶校验位。
  3. 我知道没有用于计算奇偶校验位的内置功能。<​​/ p>

答案 1 :(得分:2)

也许是这样的:

public static byte[] StringTo7bitAsciiEvenParity(string text)
{
    byte[] bytes = Encoding.ASCII.GetBytes(text);

    for(int i = 0; i < bytes.Length; i++)
    {
        if(((((bytes[i] * 0x0101010101010101UL) & 0x8040201008040201UL) % 0x1FF) & 1) == 0)
        {
            bytes[i] &= 0x7F;
        }
        else
        {
            bytes[i] |= 0x80;
        }
    }
    return bytes;
}

完全未经测试。不要问我如何计算奇偶校验的魔力。我只是found it here。但是这个的一些变体应该做你想要的。

我试图让案例','成为0x82。但我无法弄清楚应该怎么做。 ','是ASCII,二进制00101100,0x82是二进制10000010.我根本看不到相关性。

答案 2 :(得分:1)

假设字节级奇偶校验和无尾端相关行为(即字节流),以下工作按预期工作(针对已知7-bit ASCII even parity table进行测试):

public static byte[] GetAsciiBytesEvenParity(this string text)
{
    byte[] bytes = Encoding.ASCII.GetBytes(text);

    for(int ii = 0; ii < bytes.Length; ii++)
    {
        // parity test adapted from: 
        // http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel
        if (((0x6996 >> ((bytes[ii] ^ (bytes[ii] >> 4)) & 0xf)) & 1) != 0)
        {
            bytes[ii] |= 0x80;
        }
    }

    return bytes;
}