Проблема С# с использованием Blowfish NET:Как преобразовать Uint32[] в byte[]
Вопрос
В C# я использую файл BlowfishECB.cs Blowfish.NET 2.1.3(можно найти здесь)
В C++ это неизвестно, но похоже.
В C++ процедура Initialize(blowfish) выглядит следующим образом:
void cBlowFish::Initialize(BYTE key[], int keybytes)
В C# процедура Initialize(blowfish) такая же.
public void Initialize(byte[] key, int ofs, int len)
Это проблема:
Вот как инициализируется ключ в C++
DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
Как видите, ключ представляет собой массив из двух DWORDS общей длиной 8 байт.
В C# я объявляю это так, но получаю ошибку
BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);
Ошибка:
Аргумент «1»:невозможно преобразовать из 'uint[]' в 'byte[]'
Что я делаю не так?
Заранее спасибо!
Решение
Вы можете использовать Битконвертер чтобы получить байты из UInt32.
Для этого вам нужно будет преобразовать каждый элемент в цикле.Я бы сделал что-то вроде:
private byte[] ConvertFromUInt32Array(UInt32[] array)
{
List<byte> results = new List<byte>();
foreach(UInt32 value in array)
{
byte[] converted = BitConverter.GetBytes(value);
results.AddRange(converted);
}
return results.ToArray();
}
Вернуться назад:
private UInt32[] ConvertFromByteArray(byte[] array)
{
List<UInt32> results = new List<UInt32>();
for(int i=0;i<array.Length;i += 4)
{
byte[] temp = new byte[4];
for (int j=0;j<4;++j)
temp[j] = array[i+j];
results.Add(BitConverter.ToUInt32(temp);
}
return results.ToArray();
}
Другие советы
Если вы используете VS2008 или C# 3.5, попробуйте следующее решение LINQ + BitConverter.
var converted =
keyArray
.Select(x => BitConverter.GetBytes(x))
.SelectMany(x => x)
.ToArray();
Разрывая это
- Select преобразует каждый UInt32 в байт[].Результатом является IEnumerable<byte[]>.
- Вызовы SelectMany выравнивают IEnumerable<byte[]> до IEnumerable<byte>
- ToArray() просто преобразует перечисляемое в массив.
РЕДАКТИРОВАТЬ Решение без LINQ, которое работает так же хорошо
List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
Если вам нужен Быстрее Чтобы преобразовать типы значений, вы можете использовать хак, который я описал в следующем ответе: Каков самый быстрый способ преобразовать число с плавающей точкой [] в байт []?
Этот хак позволяет избежать выделения памяти и итераций.Это дает вам другой взгляд на ваш массив в O (1).
Конечно, вам следует использовать это только в том случае, если производительность является проблемой (избегайте преждевременной оптимизации).