既然您已经告诉我们长度是预定义的长度,那么下面的陈述就变得更清楚了:
我不知道如何将此信息传递给反序列化器
事实上,它变得毫无意义。没有预定义的序列化程序可以在这里为您提供帮助。你有两个选择:
A:编写您自己的序列化程序,并在您知道格式后处理数据 - 可能使用BinaryReader
:
using(var reader = new BinaryReader(source)) {
int in = reader.ReadInt32();
byte[] arr = reader.ReadBytes(32);
int[] arr2 = new int[4];
for(int i = 0 ; i < 4 ; i++) arr2[i] = reader.ReadInt32();
float fl = reader.ReadSingle();
var obj = /* something involving ^^^ */
}
B:缓冲 56 字节,并使用非常讨厌的unsafe
//fixed
指针碰撞代码
我强烈建议第一个。特别是,如果需要,这也将允许您解决字节顺序问题。
以对你来说神圣的一切的名义,不要这样做:
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
unsafe struct sample
{
[FieldOffset(0)] public int @in;
[FieldOffset(4)] public fixed byte arr[32];
[FieldOffset(36)] public fixed int arr2[4];
[FieldOffset(52)] public float fl;
}
static class Program
{
unsafe static void Main()
{
byte[] buffer = new byte[56];
new Random().NextBytes(buffer); // some data...
sample result;
fixed(byte* tmp = buffer)
{
sample* ptr = (sample*) tmp;
result = ptr[0];
}
Console.WriteLine(result.@in);
Console.WriteLine(result.fl);
}
}
对于较大的缓冲区,您可以将ptr
其视为一个不安全的 multiple 数组sample
,按索引访问:
int @in = ptr[i].@in;
(ETC)
但老实说......有很多“邪恶”的东西,我真的不知道从哪里开始......只是......除非你绝对知道那里的每一行都在做什么,以前做过,而且了解所有的陷阱...不要想它