将值写入字节数组而不使用 C# unsafe 或 fixed 关键字
Posted
技术标签:
【中文标题】将值写入字节数组而不使用 C# unsafe 或 fixed 关键字【英文标题】:Writing a value to a byte array without using C# unsafe nor fixed keyword 【发布时间】:2018-03-23 05:52:20 【问题描述】:在 C 或 C++ 中,我们可以将变量的值直接写入字节数组。
int value = 3;
unsigned char array[100];
*(int*)(&array[10]) = value;
在 C# 中,我们也可以使用 unsafe
和 fixed
关键字来做到这一点。
int value = 3;
byte[] array = new byte[100];
fixed(...) ...
但是,Unity3D 不允许使用unsafe
或fixed
。在这种情况下,运行时经济高效的方法是什么?我大致猜想它可以通过在 .Net Core 或 .Net Framework 中使用二进制读取器或写入器类来完成,但我不确定。
【问题讨论】:
char
数组不是 byte
数组。你想得到什么?
您的具体意思是如何将int
写在char 数组中,或者一般情况下?
我更改了代码。 @Backs
@Evk 是的。我想在字符或字节数组中间写int
。
Unity 支持 unsafe
和 fixed
关键字。见Djeurissen的回答
【参考方案1】:
由于您不能使用 unsafe - 您可以自己打包 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);
但要注意字节序。
【讨论】:
【参考方案2】:您也可以尝试在 Unity 中激活 unsafe 关键字: How to use unsafe code Unity
这样可以省去你使用任何“黑客”的精力。
【讨论】:
以上是关于将值写入字节数组而不使用 C# unsafe 或 fixed 关键字的主要内容,如果未能解决你的问题,请参考以下文章