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

StackOverflow https://stackoverflow.com/questions/692810

  •  22-08-2019
  •  | 
  •  

Вопрос

В 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).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top