在特定索引中将double值设置为byte数组

时间:2018-04-18 15:16:51

标签: c# unsafe

我用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测量时间。

一个周期的平均时间:

  1. 极端 - 0.004刻度(SetBytes)

  2. 常规 - 0.028刻度(SetBytesArray)

  3. 谢谢,

1 个答案:

答案 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偏移]