Преобразование двойного массива в байтовый массив - PullRequest
12 голосов
/ 05 августа 2011

Как преобразовать массив double[] в массив byte[] и наоборот?

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(sizeof(double));
        Console.WriteLine(double.MaxValue);

        double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 };
        byte[] convertedarray = ?

        Console.Read();
    }
}

Ответы [ 7 ]

19 голосов
/ 05 августа 2011

Предполагая, что вы хотите, чтобы двойники помещались в соответствующий байтовый массив один за другим, LINQ может сделать короткую работу из этого:

static byte[] GetBytes(double[] values)
{
    return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray();
}

Кроме того, вы можете использовать Buffer.BlockCopy():

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

Чтобы преобразовать обратно:

static double[] GetDoubles(byte[] bytes)
{
    return Enumerable.Range(0, bytes.Length / sizeof(double))
        .Select(offset => BitConverter.ToDouble(bytes, offset * sizeof(double)))
        .ToArray();
}

static double[] GetDoublesAlt(byte[] bytes)
{
    var result = new double[bytes.Length / sizeof(double)];
    Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length);
    return result;
}
6 голосов
/ 05 августа 2011

Вы можете использовать методы Select и ToArray для преобразования одного массива в другой:

oneArray = anotherArray.Select(n => {
  // the conversion of one item from one type to another goes here
}).ToArray();

Для преобразования из двойного в байт:

byteArray = doubleArray.Select(n => {
  return Convert.ToByte(n);
}).ToArray();

Для преобразования изчтобы удвоить число байтов, просто измените часть преобразования:

doubleArray = byteArray.Select(n => {
  return Convert.ToDouble(n);
}).ToArray();

Если вы хотите преобразовать каждый дубль в многобайтовое представление, вы можете использовать метод SelectMany и класс BitConverter,Поскольку каждое двойное число приведет к массиву байтов, метод SelectMany сведет их в один результат.

byteArray = doubleArray.SelectMany(n => {
  return BitConverter.GetBytes(n);
}).ToArray();

Чтобы преобразовать обратно в двойные числа, вам нужно будет зациклить восемь байтов за раз:

doubleArray = Enumerable.Range(0, byteArray.Length / 8).Select(i => {
  return BitConverter.ToDouble(byteArray, i * 8);
}).ToArray();
2 голосов
/ 05 августа 2011
double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 };
byte[] convertedarray = array.Select(x => Convert.ToByte(x)).ToArray();
2 голосов
/ 05 августа 2011

Используйте класс Bitconverter .

0 голосов
/ 05 августа 2011

Вы должны использовать Buffer.BlockCopy метод.

Посмотрите на пример страниц, вы четко поймете.

doubleArray = byteArray.Select(n => {return Convert.ToDouble(n);}).ToArray();
0 голосов
/ 05 августа 2011

Вы можете использовать что-то вроде этого, я думаю:

byte[] byteArray = new byteArray[...];  
...
byteArray.SetValue(Convert.ToByte(d), index);
0 голосов
/ 05 августа 2011
var byteArray = (from d in doubleArray
                 select (byte)d)
                .ToArray();

var doubleArray = (from b in byteArray
                   select (double)b)
                  .ToArray();

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...