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!

War es hilfreich?

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top