将值写入字节数组而不使用 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# 中,我们也可以使用 unsafefixed 关键字来做到这一点。

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

但是,Unity3D 不允许使用unsafefixed。在这种情况下,运行时经济高效的方法是什么?我大致猜想它可以通过在 .Net Core 或 .Net Framework 中使用二进制读取器或写入器类来完成,但我不确定。

【问题讨论】:

char 数组不是 byte 数组。你想得到什么? 您的具体意思是如何将int 写在char 数组中,或者一般情况下? 我更改了代码。 @Backs @Evk 是的。我想在字符或字节数组中间写int Unity 支持 unsafefixed 关键字。见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 关键字的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌入式资源作为字节数组读取而不将其写入磁盘?

如何显示字节数组十六进制值?

可以将 Byte[] 数组写入 C# 中的文件吗?

使用单个昏暗数组将值分配给两个昏暗数组

将短数组从音频记录转换为字节数组而不降低音频质量?

大字节数组的 C# 程序性能 [重复]