从 NamedPipeClientStream 转移位

Shifting Bits from a NamedPipeClientStream

我目前正在尝试编写一个通过 NamedPipeClientStream 读取数据的位同步串行协议。然后需要持续监视此数据的同步字符(十六进制 22),这些字符可能在字节边界上,也可能不在字节边界上,并相应地移动数据以确保接收到的其他数据在帧中。

我已经制作了几个方案的原型,包括一个位数组和使用一个发布到该站点的人设计的 BitStream 对象,所有这些看起来都很麻烦而且很可能非常低效。

正在发送的数据将在找到同步字符后继续传入,因此我必须继续将传入数据添加到已移位的比特流的末尾。

可能是这样的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("filename");
            UInt16 chr = (UInt16)reader.Read();
            UInt16 word = 0;
            int shift = -1;

            while (shift == -1)
            {
                word = (UInt16)((UInt16)(word << 8) | chr);
                shift = TestSync(chr, word);
            }
            while ((chr = (UInt16)reader.Read()) >= 0)
            {
                word = (UInt16)((UInt16)(word << 8) | chr);
                byte newChar = (byte)((word >> shift) & 0xff);

            }


        }
        static int TestSync(UInt16 chr, UInt16 word)
        {
            int results = -1;


            if((UInt16)(word & 0xff) == 0x11) return 0;
            if((UInt16)(word & 0xff) == 0x22) return 1; 
            if((UInt16)(word & 0xff) == 0x44) return 2;
            if((UInt16)(word & 0xff) == 0x88) return 3;
            if((UInt16)(word & 0x1fe) == 0x110) return 4;
            if((UInt16)(word & 0x3fc) == 0x220) return 5;
            if((UInt16)(word & 0x7f8) == 0x440) return 6;
            if ((UInt16)(word & 0xff0) == 0x880) return 7;

            return results;
        }
    }
}
​