1

Double[] src から Byte[] 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);
    }
  }
}

List src に対して同じことを行うにはどうすればよいですか? つまり、 List に含まれる配列 Double[] への固定ポインタを取得するにはどうすればよいですか? ありがとう。

4

7 に答える 7

1

リフレクションを使用して、List インスタンスのプライベート T[] _items フィールドへの参照を取得できます。

警告: コード スニペットでは、dstLength が dst と src の長さのバイト単位の最小値であることを確認する必要があります。これにより、使用可能なバイト数を超えてコピーしようとしなくなります。おそらく、src と一致するために必要なサイズで正確に dst を作成することでそうしますが、スニペットではそれが明確になりません。

于 2010-12-09T15:41:55.837 に答える
1

あなたが何を意図しているのかはわかりませんが、私は思う...あなたがしたい System.Runtime.Interopservices.Marshal.StructToPtr.

于 2010-12-09T15:22:46.563 に答える
1

以前にこれらのヘルパー メソッドを使用したことがあります。

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();
于 2012-12-11T23:47:17.483 に答える
1

オブジェクトのToArray()メソッドをいつでも使用して、 .List<Double>Double[]

于 2010-12-09T15:23:36.357 に答える
0

いつものようにリストにアクセスしてみませんか?

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;
    }
}
于 2010-12-09T16:01:39.057 に答える
0

これはうまくいくかもしれませんが、配列の内容が 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>();
于 2010-12-09T17:55:43.863 に答える
0

メソッドを使用List<T>.ToArray()して、結果の配列を操作します。

于 2010-12-09T15:23:01.667 に答える