C # конвертировать из uint [] в byte [] - PullRequest
4 голосов
/ 07 ноября 2011

Это может быть простым, но я не могу найти легкий способ сделать это. Мне нужно сохранить массив из 84 единиц в поле BINARY базы данных SQL. Поэтому я использую следующие строки в своем проекте C # ASP.NET:

//This is what I have
uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = ???

cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;

Так как же вы преобразуете из uint [] в байт []?

Ответы [ 5 ]

10 голосов
/ 07 ноября 2011

Как насчет:

byte[] byteArray = uintArray.SelectMany(BitConverter.GetBytes).ToArray();

Это будет делать, что вы хотите, в формате с прямым порядком байтов ...

4 голосов
/ 07 ноября 2011

Вы можете использовать System.Buffer.BlockCopy, чтобы сделать это:

byte[] byteArray = new byte[uintArray.Length * 4];
Buffer.BlockCopy(uintArray, 0, byteArray, 0, uintArray.Length * 4];

http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

Это будет намного эффективнее, чем использование цикла for или подобной конструкции. Он напрямую копирует байты из первого массива во второй.

Чтобы преобразовать обратно, просто сделайте то же самое в обратном порядке.

3 голосов
/ 07 ноября 2011

Для этого нет встроенной функции преобразования. Из-за того, как работают массивы, необходимо будет выделить целый новый массив и заполнить его значения. Вы, вероятно, просто должны написать это сами. Вы можете использовать функцию System.BitConverter.GetBytes(uint), чтобы выполнить часть работы, а затем скопировать полученные значения в окончательное значение byte[].

.

Вот функция, которая будет выполнять преобразование в формате с прямым порядком байтов:

    private static byte[] ConvertUInt32ArrayToByteArray(uint[] value)
    {
        const int bytesPerUInt32 = 4;
        byte[] result = new byte[value.Length * bytesPerUInt32];
        for (int index = 0; index < value.Length; index++)
        {
            byte[] partialResult = System.BitConverter.GetBytes(value[index]);
            for (int indexTwo = 0; indexTwo < partialResult.Length; indexTwo++)
                result[index * bytesPerUInt32 + indexTwo] = partialResult[indexTwo];
        }
        return result;
    }
2 голосов
/ 07 ноября 2011
byte[] byteArray = Array.ConvertAll<uint, byte>(
    uintArray,
    new Converter<uint, byte>(
        delegate(uint u) { return (byte)u; }
    ));

Прислушайтесь к совету @ liho1eye, убедитесь, что ваши символы действительно соответствуют байту, иначе вы теряете данные.

0 голосов
/ 07 ноября 2011

Если вам нужны все биты из каждого uint, вам нужно будет сделать байт соответствующего размера [] и скопировать каждый uint в четыре байта, которые он представляет.

Что-то подобное должно работать:

uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = new byte[uintArray.Length * sizeof(uint)];
for (int i = 0; i < uintArray.Length; i++)
{
    byte[] barray = System.BitConverter.GetBytes(uintArray[i]);
    for (int j = 0; j < barray.Length; j++)
    {
          byteArray[i * sizeof(uint) + j] = barray[j];
    }
}
cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;
...