Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中将List转换为Byte[]_C#_Unsafe Pointers - Fatal编程技术网

C# 如何在C中将List转换为Byte[]

C# 如何在C中将List转换为Byte[],c#,unsafe-pointers,C#,Unsafe Pointers,从双[]src到字节[]dst的转换 可以通过固定指针在C中高效完成: fixed( Double* pSrc = src) { fixed( Byte* pDst = dst) { Byte* ps = (Byte*)pSrc; for (int i=0; i < dstLength; i++) { *(pDst + i) = *(ps +i); } } } 如何对列表src执行相同的操作? 即,如何获得指向数组Double[]的

从双[]src到字节[]dst的转换 可以通过固定指针在C中高效完成:

fixed( Double* pSrc = src)
{
  fixed( Byte* pDst = dst)
  {
    Byte* ps = (Byte*)pSrc;
    for (int i=0; i < dstLength; i++)
    {
      *(pDst + i) = *(ps +i);
    }
  }
}
如何对列表src执行相同的操作? 即,如何获得指向数组Double[]的固定指针 列入名单?
谢谢。

我不知道你想要什么,但我想。。。你想要
System.Runtime.Interopservices.Marshal.StructToPtr.

不确定您的意图,但我认为。。。你想要
System.Runtime.Interopservices.Marshal.StructOptr.

使用List.ToArray方法并对结果数组进行操作。

使用List.ToArray方法并对结果数组进行操作。

始终可以对List对象使用ToArray方法来获得双精度[].

您可以始终在列表对象上使用ToArray方法来获取双[]。

您可以使用反射来获取对列表实例中私有T[]\u项字段的引用


警告:在代码段中,您需要确保dstLength是dst和src长度(以字节为单位)中的最小值,这样您就不会试图复制比可用字节更多的字节。可能是通过创建与src完全匹配所需大小的dst来实现的,但是您的代码片段没有明确说明这一点。

您可以使用反射来获取对列表实例中私有t[]\u items字段的引用


警告:在代码段中,您需要确保dstLength是dst和src长度(以字节为单位)中的最小值,这样您就不会试图复制比可用字节更多的字节。您可能是通过创建与src完全匹配所需大小的dst来实现的,但是您的代码片段没有明确说明这一点。

为什么不像往常一样访问列表呢

List<double> list = new List<double>();
list.Add(Math.PI);
list.Add(34.22);

byte[] res = new byte[list.Count * sizeof(double)];

unsafe
{
    fixed (byte* pres = res)
    {
        for (int i = 0; i < list.Count; i++)
        {
            *(((double*)pres) + i) = list[i];
        }
    }
}
我还没有对它进行彻底的测试,而且我很少需要不安全的代码,但它似乎工作得很好

编辑:这是另一个imo首选的解决方案,没有不安全的代码:

int offset = 0;
for (int i = 0; i < list.Count; i++)
{
    long num = BitConverter.DoubleToInt64Bits(list[i]);

    for (int j = 0; j < 8; j++)
    {
        res[offset++] = (byte)num;
        num >>= 8;
    }
}

你为什么不像往常一样访问列表呢

List<double> list = new List<double>();
list.Add(Math.PI);
list.Add(34.22);

byte[] res = new byte[list.Count * sizeof(double)];

unsafe
{
    fixed (byte* pres = res)
    {
        for (int i = 0; i < list.Count; i++)
        {
            *(((double*)pres) + i) = list[i];
        }
    }
}
我还没有对它进行彻底的测试,而且我很少需要不安全的代码,但它似乎工作得很好

编辑:这是另一个imo首选的解决方案,没有不安全的代码:

int offset = 0;
for (int i = 0; i < list.Count; i++)
{
    long num = BitConverter.DoubleToInt64Bits(list[i]);

    for (int j = 0; j < 8; j++)
    {
        res[offset++] = (byte)num;
        num >>= 8;
    }
}

这可能会起作用,但会丢失数据—数组的内容将是3和34

    List<double> list = new List<double>();
    list.Add(Math.PI);
    list.Add(34.22);

    byte[] arr = (from l in list
                  select (byte)l).ToArray<byte>();

这可能会起作用,但会丢失数据—数组的内容将是3和34

    List<double> list = new List<double>();
    list.Add(Math.PI);
    list.Add(34.22);

    byte[] arr = (from l in list
                  select (byte)l).ToArray<byte>();

我以前使用过这些帮助器方法:

byte[] GetBytesBlock(double[] values)
{
   var result = new byte[values.Length * sizeof(double)];
   Buffer.BlockCopy(values, 0, result, 0, result.Length);
   return result;
}

double[] GetDoublesBlock(byte[] bytes)
{
   var result = new double[bytes.Length / sizeof(double)];
   Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length);
   return result;
}
例如:

List<double> myList = new List<double>(){ 1.0, 2.0, 3.0};

//to byte[]
var byteResult = GetBytesBlock(myList.ToArray());

//back to List<double>
var doubleResult = GetDoublesBlock(byteResult).ToList();

我以前使用过这些帮助器方法:

byte[] GetBytesBlock(double[] values)
{
   var result = new byte[values.Length * sizeof(double)];
   Buffer.BlockCopy(values, 0, result, 0, result.Length);
   return result;
}

double[] GetDoublesBlock(byte[] bytes)
{
   var result = new double[bytes.Length / sizeof(double)];
   Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length);
   return result;
}
例如:

List<double> myList = new List<double>(){ 1.0, 2.0, 3.0};

//to byte[]
var byteResult = GetBytesBlock(myList.ToArray());

//back to List<double>
var doubleResult = GetDoublesBlock(byteResult).ToList();

我甚至不知道有这样的东西存在…我更好奇的是,你为什么要通过指针这样做?我甚至不知道有这样的东西存在…我更好奇的是,你为什么要通过指针这样做?我不认为这是可取的,因为这意味着创建了第三个数组,并将值复制到其中,因此,工作和内存消耗翻了一番。我认为这是不可取的,因为这意味着创建了第三个数组并将值复制到其中,因此工作和内存消耗翻了一番。转换double*pres驻留在循环中。因此,在列表实例中获取指向私有T[]_items字段的指针并将其转换为Byte*是否会更有效?据我所知,@user536443“转换”实际上是不可操作的,因此不会影响性能。内存中的数据只是以不同的方式复制和解释。您的代码一次执行一个字节,我的代码一次执行一个双字节。@user536443由于范围检查的原因,以这种方式访问列表可能比使用指针要贵一些。除此之外,我认为基本上是一样的。如果您>确实<需要性能,则测量执行时间。其他一切都是推测性的。如果没有必要,请不要进行优化。谢谢。我将尝试这两种解决方案转换双*压力驻留在循环中。因此,在列表实例中获取指向私有T[]_items字段的指针并将其转换为Byte*是否会更有效?据我所知,@user536443“转换”实际上是不可操作的,因此不会影响性能。内存中的数据只是以不同的方式复制和解释。您的代码一次执行一个字节,我的代码一次执行一个双字节。@user536443由于范围检查的原因,以这种方式访问列表可能比使用指针要贵一些。除此之外,我认为基本上是一样的。如果您>确实<需要性能,则测量执行时间。其他一切都是推测性的。如果没有必要,请不要进行优化。谢谢。我将尝试两种解决方案