我用C#编程。
我正在寻找将double(或任何原始)值设置为特定偏移量中的存在字节数组的有效方法。 我熟悉BitConverter.GetBytes和Buffer.BlockCopy命令。 我正在寻找能够将原始值直接设置为数组中特定字节偏移量的函数,而无需新的内存分配 像这个代码
public unsafe static void SetBytes(int value,byte[] output,int index)
{
fixed(byte* b = output)
*((int*)b+index) = value;
}
常规版本:
public unsafe static void SetBytesArray(int value, byte[] output, int index)
{
byte[] byteValue = BitConverter.GetBytes(value);
Buffer.BlockCopy(byteValue, 0, output, index * 4, 4);
}
论坛中的朋友要求我在上面的极端版本和常规版本之间添加度量压缩
我创建了1000个字节的数组,在每个循环中,我用常量int值填充所有数组。 我重复上述动作10000次,用StopWatch测量时间。
一个周期的平均时间:
极端 - 0.004刻度(SetBytes)
常规 - 0.028刻度(SetBytesArray)
谢谢,
麦
答案 0 :(得分:1)
据我所见,你所拥有的东西应该有效(一旦你修复了编译错误)。
例如:
using System;
using System.Linq;
namespace Demo
{
class Program
{
static void Main()
{
byte[] data = new byte[16];
int value = 0x12345678;
SetBytes(value, data, 5);
// This prints "0, 0, 0, 0, 0, 78, 56, 34, 12, 0, 0, 0, 0, 0, 0, 0"
Console.WriteLine(string.Join(", ", data.Select(b => b.ToString("x"))));
}
public static unsafe void SetBytes(int value, byte[] output, int index)
{
fixed (byte* b = output)
*((int*)(b + index)) = value;
}
}
}
[编辑:更改为使用字节偏移而不是int偏移]