在不使用C#unsafe或fixed关键字的情况下将值写入字节数组

时间:2018-03-23 05:52:21

标签: c# .net unity3d

在C或C ++中,我们可以将变量的值直接写入字节数组。

int value = 3;
unsigned char array[100];
*(int*)(&array[10]) = value;

在C#中,我们也可以使用unsafefixed关键字来完成此操作。

int value = 3;
byte[] array = new byte[100];
fixed(...) { ... }

但是,Unity3D不允许使用unsafefixed。在这种情况下,运行时具有成本效益的方法是什么?我粗略猜测可以使用.Net Core或.Net Framework中的二进制读取器或编写器类来完成,但我不确定。

2 个答案:

答案 0 :(得分:2)

由于您无法使用不安全的内容 - 您可以自己打包int值:

int value = 3;
var array = new char[100];
array[10] = (char)value; // right half
array[11] = (char)(value >> 16); // left half

因为char在C#(16位数)中基本上是ushort。这应该与使用

的C ++中的相同
*(int*)(&array[10]) = value;

另一种方法是使用`BitConverter:

var bytes = BitConverter.GetBytes(value);
array[10] = (char)BitConverter.ToInt16(bytes, 0);
array[11] = (char)BitConverter.ToInt16(bytes, 2);

但要注意结束。

答案 1 :(得分:2)

您还可以尝试在Unity中激活unsafe关键字: How to use unsafe code Unity

这样可以免除你使用任何" hacks"。