C # NET Problème d'utilisation Blowfish: Comment convertir Uint32 [] à l'octet []
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!
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).