C # Problem mit Blowfish-NET: Wie aus Uint32 konvertieren [], um byte []
Frage
In C #, ich bin mit Blowfish.NET 2.1.3 der BlowfishECB.cs Datei ( gefunden werden kann hier )
In C ++ Es ist nicht bekannt, aber es ist ähnlich.
In C ++, das Initialisieren (Blowfish) -Verfahren ist die folgende:
void cBlowFish::Initialize(BYTE key[], int keybytes)
In C #, das Initialisieren (Blowfish) Verfahren ist das gleiche
public void Initialize(byte[] key, int ofs, int len)
Das ist das Problem:
Dies ist, wie der Schlüssel in C ++ initialisiert
DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
Wie Sie sehen, ist der Schlüssel ist ein Array von zwei DWORDS, die 8 Bytes insgesamt ist.
In C # Ich erkläre es so, aber ich erhalte eine Fehlermeldung
BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);
Der Fehler ist:
Das Argument '1': Konvertierung von 'uint []' auf 'byte []
Was mache ich falsch?
Vielen Dank im Voraus!
Lösung
Sie können mit BitConverter das Bytes von einem UInt32 bekommen.
Um dies zu tun, müssen Sie jedes Element in einer Schleife konvertieren. Ich würde so etwas wie:
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();
}
Um wieder:
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();
}
Andere Tipps
Wenn Sie VS2008 oder C # 3.5 verwenden, versuchen Sie die folgende LINQ + BitConverter Lösung
var converted =
keyArray
.Select(x => BitConverter.GetBytes(x))
.SelectMany(x => x)
.ToArray();
Breaking diese nach unten
- Die Select wandelt alle UInt32 in ein byte []. Das Ergebnis ist ein IEnumerable
- Die Select ruft flattes die IEnumerable
zu IEnumerable - ToArray () konvertiert die enumerable in ein Array
Bearbeiten Non LINQ-Lösung, die genauso gut
funktioniertList<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
Wenn Sie eine müssen schneller Möglichkeit, Ihre Werttypen zu konvertieren, können Sie den Hack verwende ich in der folgenden Antwort beschrieben: Was ist der schnellste Weg einen Schwimmer [] zu einem byte []?
Dieser Hack Speicherzuordnungen und Wiederholungen vermeiden. Es gibt Ihnen eine andere Sicht auf das Array in O (1).
Natürlich sollten Sie dies nur verwenden, wenn die Leistung ist ein Problem (vorzeitige Optimierung vermeiden).