C # Проблема с использованием blowfish NET: Как преобразовать из Uint32 [] в байт [] - PullRequest
2 голосов
/ 28 марта 2009

В 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 []'

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

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

Ответы [ 3 ]

5 голосов
/ 28 марта 2009

Вы можете использовать BitConverter для получения байтов из 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(); }

4 голосов
/ 28 марта 2009

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

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

Разбить это

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

РЕДАКТИРОВАТЬ Решение не LINQ, которое работает так же хорошо

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
0 голосов
/ 12 марта 2012

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

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

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

...