Проблема 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 ответа:
Вы можете использовать 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).
Конечно, вы должны использовать это только в том случае, если производительность является проблемой (избегайте преждевременной оптимизации).