从 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;
}
}
}
我目前正在尝试编写一个通过 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;
}
}
}