Tulis byte ke file

89

Saya memiliki string heksadesimal (misalnya 0CFE9E69271557822FE715A8B3E564BE) dan saya ingin menuliskannya ke file sebagai byte. Sebagai contoh,

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¾

Bagaimana saya bisa melakukannya dengan menggunakan .NET dan C #?

John Doe
sumber
1
Mungkin duplikat stackoverflow.com/questions/311165/…
Steven Mastandrea
1
@ Steven: Hanya sebagian. Bukan bagian terpenting.
John Doe
1
Kemungkinan duplikat dari Can a Byte [] Array ditulis ke file di C #? (juga mungkin hanya sebagian duplikat).
Jeff B

Jawaban:

159

Jika saya memahami Anda dengan benar, ini seharusnya berhasil. Anda perlu menambahkan using System.IOdi bagian atas file Anda jika Anda belum memilikinya.

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
sumber
76

Cara termudah adalah dengan mengubah string heksadesimal Anda menjadi array byte dan menggunakan File.WriteAllBytesmetode ini.

Dengan menggunakan StringToByteArray()metode dari pertanyaan ini , Anda akan melakukan sesuatu seperti ini:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

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

The StringToByteArrayMetode disertakan di bawah:

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();
}
Donat
sumber
Terima kasih, ini berfungsi dengan baik. Bagaimana cara menambahkan byte ke file yang sama? (setelah 'string' pertama)
John Doe
1
@Robertico: Anda menambahkan nilai boolean true ke parameter ketiga WriteAllBytes. Apakah Anda sudah menemukan MSDN? Ini adalah link google pertama saat mencari tambahan WriteAllBytes.
1
Saya menerima kesalahan saat menambahkan nilai boolean 'Tidak ada kelebihan beban untuk metode' WriteAllBytes 'membutuhkan' 3 'argumen'. MSDN menjelaskan: 'Namun, jika Anda menambahkan data ke file menggunakan loop, objek BinaryWriter dapat memberikan kinerja yang lebih baik karena Anda hanya perlu membuka dan menutup file satu kali.' Saya menggunakan loop. Saya menggunakan contoh dari @ 0A0D dan mengubah 'FileMode.Create' menjadi 'FileMode.Append'.
John Doe
3

Coba ini:

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
sumber
Terima kasih, ini juga berfungsi dengan baik. Bagaimana cara menambahkan byte ke file yang sama? (setelah 'string' pertama)
John Doe
2

Anda mengubah string hex menjadi array byte.

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();
}

Kredit: Jared Par

Dan kemudian gunakan WriteAllBytes untuk menulis ke sistem file.

Khepri
sumber
1
Jika Anda mereferensikan jawaban Stack Overflow yang ada sebagai jawaban untuk pertanyaan ini, maka ini adalah taruhan yang cukup aman bahwa ini adalah pertanyaan duplikat dan harus ditandai seperti itu.
ChrisF
1
Dalam hal ini hanya menjawab sebagian dari pertanyaannya, jadi saya merasa tidak perlu ditandai sebagai korban penipuan. Dia hanya akan sampai setengah jalan dengan pengetahuan itu.
Khepri
0

Contoh ini membaca 6 byte menjadi array byte dan menuliskannya ke array byte lain. Itu melakukan operasi XOR dengan byte sehingga hasil yang ditulis ke file sama dengan nilai awal aslinya. File selalu berukuran 6 byte, karena ditulis pada posisi 0.

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();
        }
    }
}
cinta hidup
sumber