Schreiben Sie Bytes in die Datei

88

Ich habe eine hexadezimale Zeichenfolge (z. B. 0CFE9E69271557822FE715A8B3E564BE) und möchte sie als Byte in eine Datei schreiben. Beispielsweise,

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15
00000000   0C FE 9E 69 27 15 57 82  2F E7 15 A8 B3 E5 64 BE   .þži'.W‚/ç.¨³åd¾

Wie kann ich dies mit .NET und C # erreichen?

John Doe
quelle
1
Möglicherweise ein Duplikat von stackoverflow.com/questions/311165/…
Steven Mastandrea
1
@Steven: Nur teilweise. Nicht der wichtigste Teil.
John Doe
1
Mögliches Duplikat von Kann ein Byte [] -Array in eine Datei in C # geschrieben werden? (auch vielleicht nur ein Teilduplikat).
Jeff B

Antworten:

158

Wenn ich Sie richtig verstehe, sollte dies den Trick tun. Sie müssen using System.IOoben in Ihrer Datei hinzufügen, wenn Sie es noch nicht haben.

public bool ByteArrayToFile(string fileName, byte[] byteArray)
{
    try
    {
        using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(byteArray, 0, byteArray.Length);
            return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in process: {0}", ex);
        return false;
    }
}
Jeff B.
quelle
74

Der einfachste Weg wäre, Ihre hexadezimale Zeichenfolge in ein Byte-Array zu konvertieren und die File.WriteAllBytesMethode zu verwenden.

Mit der StringToByteArray()Methode aus dieser Frage würden Sie ungefähr Folgendes tun:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

File.WriteAllBytes("output.dat", StringToByteArray(hexString));

Die StringToByteArrayMethode ist unten enthalten:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}
Krapfen
quelle
Thx, das funktioniert gut. Wie kann ich Bytes an dieselbe Datei anhängen? (nach der ersten 'Saite')
John Doe
1
@Robertico: Sie fügen dem dritten Parameter von WriteAllBytes den booleschen Wert true hinzu. Haben Sie MSDN schon entdeckt? Dies ist der erste Google-Link bei der Suche nach WriteAllBytes-Anhängen.
1
Ich habe eine Fehlermeldung beim Hinzufügen des booleschen Werts 'Keine Überladung für die Methode' WriteAllBytes 'hat' 3 'Argumente' erhalten. MSDN beschreibt: 'Wenn Sie jedoch einer Datei mithilfe einer Schleife Daten hinzufügen, kann ein BinaryWriter-Objekt eine bessere Leistung bieten, da Sie die Datei nur einmal öffnen und schließen müssen.' Ich benutze eine Schleife. Ich verwende das Beispiel von @ 0A0D und habe 'FileMode.Create' in 'FileMode.Append' geändert.
John Doe
3

Versuche dies:

private byte[] Hex2Bin(string hex) 
{
 if ((hex == null) || (hex.Length < 1)) {
  return new byte[0];
 }
 int num = hex.Length / 2;
 byte[] buffer = new byte[num];
 num *= 2;
 for (int i = 0; i < num; i++) {
  int num3 = int.Parse(hex.Substring(i, 2), NumberStyles.HexNumber);
  buffer[i / 2] = (byte) num3;
  i++;
 }
 return buffer;
}

private string Bin2Hex(byte[] binary) 
{
 StringBuilder builder = new StringBuilder();
 foreach(byte num in binary) {
  if (num > 15) {
   builder.AppendFormat("{0:X}", num);
  } else {
   builder.AppendFormat("0{0:X}", num); /////// 大于 15 就多加个 0
  }
 }
 return builder.ToString();
}
xling
quelle
Thx, das funktioniert auch gut. Wie kann ich Bytes an dieselbe Datei anhängen? (nach der ersten 'Saite')
John Doe
2

Sie konvertieren die Hex-Zeichenfolge in ein Byte-Array.

public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}

Bildnachweis: Jared Par

Verwenden Sie dann WriteAllBytes , um in das Dateisystem zu schreiben.

Khepri
quelle
1
Wenn Sie eine vorhandene Stapelüberlauf-Antwort als Antwort auf diese Frage referenzieren, ist es eine ziemlich sichere Wette, dass dies eine doppelte Frage ist und als solche gekennzeichnet werden sollte.
ChrisF
1
In diesem Fall beantwortete es nur einen Teil seiner Frage, so dass ich das Gefühl hatte, dass es nicht als Betrüger markiert werden musste. Mit diesem Wissen würde er nur auf halbem Weg dorthin gelangen.
Khepri
0

In diesem Beispiel werden 6 Bytes in ein Byte-Array eingelesen und in ein anderes Byte-Array geschrieben. Es führt eine XOR-Operation mit den Bytes durch, sodass das in die Datei geschriebene Ergebnis mit den ursprünglichen Startwerten übereinstimmt. Die Datei ist immer 6 Byte groß, da sie an Position 0 schreibt.

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
        byte[] b1 = { 1, 2, 4, 8, 16, 32 };
        byte[] b2 = new byte[6];
        byte[] b3 = new byte[6];
        byte[] b4 = new byte[6];

        FileStream f1;
        f1 = new FileStream("test.txt", FileMode.Create, FileAccess.Write);

        // write the byte array into a new file
        f1.Write(b1, 0, 6);
        f1.Close();

        // read the byte array
        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        f1.Read(b2, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b2.Length; i++)
        {
            b2[i] = (byte)(b2[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);
        // write the new byte array into the file
        f1.Write(b2, 0, 6);
        f1.Close();

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read);

        // read the byte array
        f1.Read(b3, 0, 6);
        f1.Close();

        // make changes to the byte array
        for (int i = 1; i < b3.Length; i++)
        {
            b4[i] = (byte)(b3[i] ^ (byte)10); //xor 10
        }

        f1 = new FileStream("test.txt", FileMode.Open, FileAccess.Write);

        // b4 will have the same values as b1
        f1.Write(b4, 0, 6);
        f1.Close();
        }
    }
}
Live-Liebe
quelle