Проблема C# с использованием blowfish NET: как преобразовать из Uint32[] в byte[]


В C#я использую Blowfish.NET 2.1.3 выдувная рыба.cs-файл (можно найти здесь)

В C++это неизвестно, но похоже.

В C++процедура инициализации(blowfish) выглядит следующим образом:

void cBlowFish::Initialize(BYTE key[], int keybytes)

В C#процедура инициализации(blowfish) такая же

public void Initialize(byte[] key, int ofs, int len) 

Вот в чем проблема:

Именно так ключ инициализируется в C++

DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);

Как вы видите,ключ представляет собой массив из двух слов DW, что составляет всего 8 байт.

В C# я объявляю его вот так, но я получаю ошибку

BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);

Ошибка такова:

Аргумент '1': не удается преобразовать из 'uint []' в 'byte []'

Что я делаю не так?

Заранее спасибо!

3 2

3 ответа:

Вы можете использовать BitConverter для получения байтов из UInt32.


Для этого вам нужно преобразовать каждый элемент в цикле. Я бы сделал что-то вроде:

{[0]}

Вернуться назад:

{[1]}

Если вы используете VS2008 или C# 3.5, попробуйте следующее решение LINQ + BitConverter

var converted = 
  keyArray
    .Select(x => BitConverter.GetBytes(x))
    .SelectMany(x => x)
    .ToArray();

Сломать это

  • Select преобразует каждый UInt32 в байт[]. Результатом является IEnumerable
  • этого метода SelectMany называет flattes интерфейс IEnumerable к IEnumerable
  • ToArray () просто преобразует перечисляемое в массив

EDIT не LINQ решение, которое работает так же хорошо

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();

Если вам нужен более быстрый способ преобразования типов значений, вы можете использовать хак, который я описал в следующем ответе: Какой самый быстрый способ преобразовать float [] в байт []?

Этот хак позволяет избежать выделения памяти и итераций. Это дает вам другое представление о вашем массиве в O (1).

Конечно, вы должны использовать это только в том случае, если производительность является проблемой (избегайте преждевременной оптимизации).