C # Problema usando NET blowfish: Como converter de Uint32 [] para byte []
Pergunta
Em C #, estou usando de Blowfish.NET 2.1.3 arquivo BlowfishECB.cs ( podem ser encontrados aqui )
Em C ++, é desconhecido, mas é semelhante.
C ++, o procedimento de inicialização (blowfish) é o seguinte:
void cBlowFish::Initialize(BYTE key[], int keybytes)
C #, o processo de inicialização (blowfish) é o mesmo
public void Initialize(byte[] key, int ofs, int len)
Este é o problema:
Esta é a forma como a chave é inicializada em C ++
DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
Como você pode ver, a chave é uma matriz de dois DWORDS, que é de 8 bytes total.
Em C # eu declará-lo assim, mas eu recebo um erro
BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);
O erro é:
O argumento '1': não é possível converter de 'uint []' para 'byte []'
O que estou fazendo de errado?
Agradecemos antecipadamente!
Solução
Você pode usar BitConverter para obter os bytes de um UInt32.
Para fazer isso, você vai precisar para converter cada elemento em um loop. Eu faria 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 voltar:
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();
}
Outras dicas
Se você estiver usando VS2008 ou C # 3.5, tente o seguinte solução LINQ + BitConverter
var converted =
keyArray
.Select(x => BitConverter.GetBytes(x))
.SelectMany(x => x)
.ToArray();
Quebra este para baixo
- O Select converte cada UInt32 em um byte []. O resultado é um IEnumerable
- As chamadas SelectMany flattes o IEnumerable
para IEnumerable - ToArray () simplesmente converte a enumeráveis ??em uma matriz
Editar Solução não LINQ que funciona tão bem
List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
Se você precisa de um mais rápido maneira de converter os seus tipos de valor, você pode usar o hack I descrito na resposta seguinte: o que é a maneira mais rápida para converter um float [] para um byte []?
Este hack alocações de memória evitar e iterações. Ele lhe dá uma visão diferente da sua matriz em O (1).
É claro que você só deve usar isso se o desempenho é um problema (evitar otimização prematura).