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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top