c# - 到缓冲区中给定指针的不安全转换
问题描述
我试图弄清楚如何让这个方法从一个索引开始,而不是从 0 - 8 个字节覆盖。此外,如果有人知道如何通过联网使这项工作与大/小 edian 机器一起工作,那就太棒了。
private byte[] buffer = new byte[30];
private int ptr = 0;
unsafe void GetBytes(ulong value)
{
fixed (byte* b = buffer) //start at buffer[ptr]
*((int*)b) = *(int*)&value;
ptr += 8;
}
我想出了如何通过以下方法创建指向ptr的指针
private byte[] buffer = new byte[30];
private int ptr = 0;
unsafe void GetBytes(ulong value)
{
fixed (byte* b = &buffer[ptr]) //start at buffer[ptr]
*((int*)b) = *(int*)&value;
ptr += 8;
}
解决方案
您可以轻松地转换字节顺序:
using System.Buffers.Binary;
if (!BitConverter.IsLittleEndian)
{
value = BinaryPrimitives.ReverseEndianness(value);
}
我更喜欢使用Span
哪个更安全、更容易阅读:
using System.Buffers.Binary;
Span<byte> span = buffer;
BinaryPrimitives.WriteUInt64LittleEndian(span.Slice(ptr), value);
如果您想使用系统的字节序而不是显式的,您也可以这样做:
using System.Runtime.InteropServices;
Span<byte> span = buffer;
MemoryMarshal.Write(span.Slice(ptr), value);
编辑非核心:
在写入指针之前,您可以使用HostToNetworkOrder
将整数转换为大端。
推荐阅读
- elasticsearch - 最新 N 条记录上的 Elasticsearch 聚合
- php - 在 laravel 中动态确定 http/https
- reactjs - 在 reactJS 中从 IndexedDB 获取视频 URL
- rust - 创建递归枚举——我应该使用生命周期引用吗?(锈)
- python - Visual Studio Code 调试器不工作
- python - 我将如何正确实现异步任务?
- python - 我如何在第一个数据帧上运行一个循环,在第二个数据帧上运行一个内部循环,以计算他们的学科分数与学生之间的差异?
- matplotlib - 有没有办法在文本文件中操作数据,即更改值并绘制它们?
- python - 为什么 ColumnTransformer 中的 SimpleImputer 会创建额外的列?
- react-hooks - react-hooks/exhaustive-deps 用于传递到/从自定义钩子的参考