我需要在与大型机通信的C#应用程序中将字符串转换为具有偶校验的7位ASCII。我尝试使用Encoding.ASCII
,但它没有正确的奇偶校验。
答案 0 :(得分:2)
您必须自己计算奇偶校验位。所以:
我知道没有用于计算奇偶校验位的内置功能。</ 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;
}