我需要将简单类型序列化到预定义消息传递协议的二进制缓冲区中,因此我编写了这个示例,它将 2 个字节复制到缓冲区中:
public static int Copy(this byte[] buffer,Int16 value,int destinationIndex)
{
buffer[destinationIndex++] = (byte)(value >> 8);
buffer[destinationIndex++] = (byte)(value);
return destinationIndex;
}
Run Code Online (Sandbox Code Playgroud)
对于C#来说感觉非常底层,它基本上是C代码,这敲响了一些警钟。这是在 .NET 中实现此目的的最佳方法还是有一些更好的框架/语言功能?我也需要一种方法来扭转它,例如:
public static Int16 Parse(this byte[] buffer, int index)
{
var v = buffer[index++] << 8;
v += buffer[index++];
return (Int16)v;
}
Run Code Online (Sandbox Code Playgroud)
进行此类翻译的方法有很多种;从历史上看,它BitConverter在这里很有用,但它是相当分配的,特别是在序列化时 - 它每次都会返回一个新的。byte[]不幸的是,它还有一个依赖于 CPU 的特性,这意味着:它以当前 CPU 使用的任何方式返回数据 - 对于序列化来说并不理想,因为写入和读取机器可能是不同的架构。
最近,BinaryPrimitives这是一个更有吸引力的选择,因为它不分配。它适用于span,这意味着它可以适用于字节数组,但它也可以适用于非托管内存、堆栈分配块、固定大小缓冲区和其他场景。它还在字节顺序方面进行了明确定义,使用 JIT 的新功能将 CPU 字节顺序解释为不变量并删除不必要的代码,以便在运行时仅保留“正确”的代码。
在这种情况下,您显示的是大端编码,因此适当的方法是BinaryPrimitives.[Try]ReadInt16BigEndian(...)和BinaryPrimitives.[Try]WriteInt16BigEndian(...)。
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |