Question

En C #, j'utilise le fichier BlowfishECB.cs de Blowfish.NET 2.1.3 ( se trouvent )

En C ++, il est inconnu, mais il est similaire.

C ++, la procédure d'initialisation (de Blowfish) est le suivant:

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

En C #, la procédure Initialize (blowfish) est le même

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

Ceci est le problème:

Voici comment la clé est initialisé en C ++

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

Comme vous le voyez, la clé est un tableau de deux DWORDS, qui est de 8 octets au total.

En C # Je déclare comme ça, mais je reçois une erreur

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

L'erreur est:

Argument '1': ne peut pas convertir les 'uint []' à "byte []

Qu'est-ce que je fais mal?

Merci d'avance!

Était-ce utile?

La solution

Vous pouvez utiliser BitConverter pour obtenir les octets d'un UInt32.


Pour ce faire, vous devrez convertir chaque élément dans une boucle. Je ferais quelque chose comme:

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

Pour revenir:

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

Autres conseils

Si vous utilisez VS2008 ou C # 3.5, essayez la solution LINQ + BitConverter suivant

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

Briser ce bas

  • Sélectionnez convertit tous les UInt32 dans un octet []. Le résultat est un IEnumerable
  • Les appels SelectMany flattes IEnumerable pour IEnumerable
  • ToArray () convertit simplement le dénombrable dans un tableau

EDIT Solution non LINQ qui fonctionne aussi bien

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

Si vous avez besoin d'un moyen plus rapide pour convertir vos types de valeur, vous pouvez utiliser le hack je l'ai décrit dans la réponse suivante: Quel est le meilleur moyen de convertir un char [] à un octet []?

Ce hack éviter les allocations de mémoire et itérations. Il vous donne une vue différente de votre tableau dans O (1).

Bien sûr, vous ne devez utiliser si la performance est un problème (éviter l'optimisation prématurée).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top