Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#使用编组进行数据包解析_C#_Marshalling - Fatal编程技术网

c#使用编组进行数据包解析

c#使用编组进行数据包解析,c#,marshalling,C#,Marshalling,例如,我必须解析存储在ascii码字节[]中的数据包 byte[]user=新字节[]{112、114、97、116、121、117、115、104、0、0、0、49、50、51、0} 其中前12个字节是servername,后4个字节是某个id 通过阅读以前的stackoverflow帖子,我得到了这个代码 [StructLayout(LayoutKind.Explicit)] struct packetrf { public ulong servername {

例如,我必须解析存储在ascii码字节[]中的数据包 byte[]user=新字节[]{112、114、97、116、121、117、115、104、0、0、0、49、50、51、0} 其中前12个字节是servername,后4个字节是某个id

通过阅读以前的stackoverflow帖子,我得到了这个代码

[StructLayout(LayoutKind.Explicit)]
struct packetrf
{
  public ulong servername
    {
        get
        {
            return (ulong)servername1 | ((ulong)servername2 << 8) | ((ulong)servername3 << 16) | ((ulong)servername4 << 24) | ((ulong)servername5 << 32) | ((ulong)servername6 << 40) | ((ulong)servername7 << 48) | ((ulong)servername8 << 56) | ((ulong)servername9 << 64) | ((ulong)servername10 << 72) | ((ulong)servername11 << 80) | ((ulong)servername12 << 88);
        }
    }

    [FieldOffset(0)]
    public byte servername1;

    [FieldOffset(1)]
    public byte servername2;

    [FieldOffset(2)]
    public byte servername3;

    [FieldOffset(3)]
    public byte servername4;

    [FieldOffset(4)]
    public byte servername5;

    [FieldOffset(5)]
    public byte servername6;

    [FieldOffset(6)]
    public byte servername7;

    [FieldOffset(7)]
    public byte servername8;

    [FieldOffset(8)]
    public byte servername9;

    [FieldOffset(9)]
    public byte servername10;

    [FieldOffset(10)]
    public byte servername11;

    [FieldOffset(11)]
    public byte servername12;

   [FieldOffset(12)]
    public Int32 imei_msn;
};

static private pack fromByte(byte[] arr)
{
    pack str = new pack();
    GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
    str = (pack)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(pack));
    handle.Free();
    return str;
}

static private void data_parser(byte[] pkt, int size, int indexno)
{
       packetrf data = fromByte(pkt);
        Console.WriteLine();
        Console.WriteLine(data.servername);
        Console.WriteLine(data.imei_msn);
        Console.ReadKey();
    }


public static void Main()
{
    byte[] user = new byte[] {112, 114, 97, 116, 121, 117, 115, 104, 0, 0, 0, 0, 49, 50, 51, 0}
    data_parser(user, 1, 2);
}
[StructLayout(LayoutKind.Explicit)]
结构包
{
公共ulong服务器名
{
得到
{

return(ulong)servername1 |((ulong)servername2尝试将
servername1
-
servername12
字节添加到
byte[12]
数组中,并使用

byte[] array = GetBytesOfServerName();
string serverName = Encoding.ASCII.GetString(array);

尝试使用固定大小的数组(请阅读此处)

然后从那里:

string serv = Encoding.ASCII.GetString(yourObject.servername).TrimEnd('\0');
或者直接作为财产

public string serverName2
{
    get
    {
        return Encoding.ASCII.GetString(servername).TrimEnd('\0');
    }
}
请记住
TrimEnd
所有
'\0'
将在
字节[]
中出现的内容


你确定编码是ASCII吗?试着在名字中输入一些带重音的字母,比如
的èèù
…可能是
的UTF8
。或者可能是使用
默认的
编码。

如果你对项目使用/unsafe没有问题,你可以像这样使用固定缓冲区:

[StructLayout(LayoutKind.Explicit)]
unsafe struct packetrf
{
    [FieldOffset(0)]
    public fixed byte[12] servername;

    [FieldOffset(12)]
    public Int32 imei_msn;
}
这应该起作用:

string serverName = Encoding.ASCII.GetString(user.Take(12).ToArray());
string imeiMsn = Encoding.ASCII.GetString(user.Skip(12).ToArray());
Console.WriteLine(serverName);
Console.WriteLine(imeiMsn);

期望值是什么?在您的示例数据中,
pratyush
servername
,但是
imei\u msn
是什么?imei\u msn应该是123谢谢您的解决方案,我已经解决了我的问题。我想确认的另一件事是,如果数据大小是可变的,他们也可以选择变量字段。@user2673943否。
SizeConst
必须是在编译时已知的常量。请注意,我刚刚在代码中添加了一些关于
TrimEnd()
的注释。感谢您的解决方案
string serverName = Encoding.ASCII.GetString(user.Take(12).ToArray());
string imeiMsn = Encoding.ASCII.GetString(user.Skip(12).ToArray());
Console.WriteLine(serverName);
Console.WriteLine(imeiMsn);