Frage

Hier ist also der Deal: Ich versuche, eine Datei zu öffnen (von Bytes), wandeln es in einen String, so kann ich das Chaos mit einigen Metadaten im Header, wandeln es wieder in Bytes, und speichern Sie es. Das Problem, das ich laufe bin in richtig ist jetzt mit diesem Code. Wenn ich die Zeichenfolge vergleichen, die hin und her umgewandelt worden sind (aber nicht auf andere Weise modifizieren) auf den ursprünglichen Byte-Array, ist es ungleich. Wie kann ich diese Arbeit machen?

public static byte[] StringToByteArray(string str)
{
    UTF8Encoding encoding = new UTF8Encoding();
    return encoding.GetBytes(str);
}

public string ByteArrayToString(byte[] input)
{
    UTF8Encoding enc = new UTF8Encoding();
    string str = enc.GetString(input);
    return str;
}

Hier ist, wie ich sie habe zu vergleichen.

byte[] fileData = GetBinaryData(filesindir[0], Convert.ToInt32(fi.Length));
string fileDataString = ByteArrayToString(fileData);
byte[] recapturedBytes = StringToByteArray(fileDataString);
Response.Write((fileData == recapturedBytes));

Ich bin sicher, dass es UTF-8, mit:

StreamReader sr = new StreamReader(filesindir[0]);
Response.Write(sr.CurrentEncoding);

, die "System.Text.UTF8Encoding" zurück.

War es hilfreich?

Lösung

Versuchen Sie, die statischen Funktionen auf der Encoding Klasse, die Sie mit Instanzen der verschiedenen Codierungen zur Verfügung stellt. Sie sollen nicht die Encoding zu instanziiert brauchen nur zu / von einer Byte-Array zu konvertieren. Wie vergleichen Sie die Strings im Code?

Bearbeiten

Du vergleichst Arrays, keine Strings. Sie sind ungleich, weil sie auf zwei verschiedenen Arrays beziehen; mit dem == werden von einem Operator nur ihre Referenzen vergleichen, ihre Werte nicht. Sie werden jedes Element des Arrays, um überprüfen müssen, um zu bestimmen, ob sie gleichwertig sind.

public bool CompareByteArrays(byte[] lValue, byte[] rValue)
{
    if(lValue == rValue) return true; // referentially equal
    if(lValue == null || rValue == null) return false; // one is null, the other is not
    if(lValue.Length != rValue.Length) return false; // different lengths

    for(int i = 0; i < lValue.Length; i++)
    {
        if(lValue[i] != rValue[i]) return false;
    }

    return true;
}

Andere Tipps

Wenn Sie rohe Bytes (8-Bit möglicherweise nicht-druckbare Zeichen) haben und wollen, dass sie als .NET-String zu manipulieren, und schalten Sie sie wieder in Bytes, können Sie tun, indem Sie mit

Encoding.GetEncoding(1252)

statt UTF8Encoding. Das Codierung arbeitet jeden 8-Bit-Wert zu nehmen und es in ein .NET-16-Bit-Zeichen, und wieder zurück, ohne dass Informationen verloren gehen.

konvertieren

In dem speziellen Fall, dass Sie oben beschreiben, mit einer Binärdatei, Sie werden in der Lage zu „Chaos mit Metadaten im Header“ nicht und haben die Dinge funktionieren korrekt erkannt, wenn die Länge der Daten, die Sie verwirren mit unverändert ist. Zum Beispiel, wenn der Header enthält

{any}{any}ABC{any}{any}

und Sie möchten ABC DEF ändern, die funktionieren sollte, wie Sie möchten. Aber wenn Sie ABC zu WXYZ ändern möchten, müssen Sie über das Byte zu schreiben, die „C“ folgt, oder Sie werden (im Wesentlichen) bewegen alles ein Byte weiter nach rechts. In einer typischen Binärdatei, das wird durcheinander zu bringen stark.

Wenn der Bytes nach „ABC“ sind Leerzeichen oder Nullzeichen, gibt es eine bessere Chance, dass größeren Ersatz Schreiben von Daten wird keine Probleme verursachen - aber man kann immer noch nicht nur ABC mit WXYZ in dem .NET-String ersetzen, es länger zu machen - - Sie würden ABC {whatever_follows_it} mit WXYZ ersetzen. Da könnten Sie feststellen, dass es einfacher ist, nur die Daten als Bytes zu verlassen und die Ersatzdaten ein Byte zu einem Zeitpunkt, schreiben.

Aufgrund der Tatsache, dass .NET Strings Unicode-Strings verwenden, können Sie nicht mehr tun dies wie Menschen in C. tat In den meisten Fällen sollten Sie nicht einmal Versuch gehen hin und her von String <->. Byte-Array, es sei denn der Inhalt eigentlich Text

Ich habe diesen Punkt klar machen: In .NET, wenn die byte[] Daten nicht ist text , dann versuchen Sie es nicht zu einem string zu konvertieren mit Ausnahme des spezielle Base64-Kodierung für Binärdaten über einen Textkanal. Dies ist ein weit verbreitetes Missverständnis unter den Menschen, die in .NET arbeiten.

Ihr Problem scheint der Weg zu sein, die das Array von Bytes sind zu vergleichen:

Response.Write((fileData == recapturedBytes));

Das wird immer false zurück, da Sie die Adresse des Byte-Arrays sind zu vergleichen, nicht die Werte, die sie enthält. Vergleichen Sie die Zeichenkettendaten, oder ein Verfahren verwenden, um den Byte-Arrays verglichen werden. Man könnte dies auch statt:

Response.Write(Convert.ToBase64String(fileData) == Convert.ToBase64String(recapturedBytes));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top