Pregunta

En C#,estoy usando Blowfish.NET 2.1.3 la BlowfishECB.cs archivo(se puede encontrar aquí)

En C++,Es desconocido,pero es similar.

En C++,la Inicializar(blowfish), el procedimiento es el siguiente:

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

En C#,la Inicializar(blowfish), el procedimiento es el mismo

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

Este es el problema:

Esta es la forma en que la clave es inicializado en C++

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

Como se puede ver,la clave es una matriz de dos DWORDS,que es de 8 bytes en total.

En C#, declaro que,pero me da un error

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

El error es:

El argumento de '1':no se puede convertir de 'uint[]' a 'byte[]'

¿Qué estoy haciendo mal?

Gracias de antemano!

¿Fue útil?

Solución

Puede utilizar BitConverter para obtener los bytes desde un UInt32.


Para ello, tendrá que convertir cada elemento en un bucle. Me gustaría hacer algo como:

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();
}

Para volver:

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();
}

Otros consejos

Si está utilizando VS2008 o C # 3.5, pruebe la siguiente solución LINQ + BitConverter

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

Para romper este abajo

  • La Selección convierte cada UInt32 en un byte []. El resultado es un IEnumerable
  • La llama SelectMany flattes el IEnumerable a IEnumerable
  • ToArray () simplemente convierte la enumerable en una matriz

Editar solución para no LINQ que funciona igual de bien

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

Si necesita un manera más rápida para convertir los tipos de valor, puede utilizar el truco que he descrito en la siguiente respuesta: ¿Cuál es la manera más rápida de convertir un float [] a un byte []?

Este truco evitar asignaciones de memoria e iteraciones. Se le da una visión diferente de la matriz en O (1).

Por supuesto que sólo se debe usar este si el rendimiento es un problema (evitar la optimización prematura).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top