Ghi byte vào tệp


88

Tôi có một chuỗi thập lục phân (ví dụ 0CFE9E69271557822FE715A8B3E564BE) và tôi muốn ghi nó vào một tệp dưới dạng byte. Ví dụ,

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¾

Làm cách nào để thực hiện việc này bằng .NET và C #?


1
Có thể là một bản sao của stackoverflow.com/questions/311165/...
Steven Mastandrea

1
@Steven: Chỉ một phần. Không phải là phần quan trọng nhất.
John Doe

1
Có thể có bản sao của Mảng Byte [] Có thể được ghi vào một tệp trong C # không? (cũng có thể chỉ là bản sao một phần).
Jeff B

Câu trả lời:


158

Nếu tôi hiểu bạn một cách chính xác, điều này sẽ làm nên một mẹo nhỏ. Bạn sẽ cần thêm using System.IOở đầu tệp của mình nếu bạn chưa có.

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

74

Cách đơn giản nhất là chuyển đổi chuỗi thập lục phân của bạn thành một mảng byte và sử dụng File.WriteAllBytesphương pháp này.

Sử dụng StringToByteArray()phương pháp từ câu hỏi này , bạn sẽ làm như sau:

string hexString = "0CFE9E69271557822FE715A8B3E564BE";

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

Các StringToByteArrayphương pháp được bao gồm dưới đây:

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

Thx, điều này hoạt động tốt. Làm cách nào để nối các byte vào cùng một tệp? (sau 'chuỗi' đầu tiên)
John Doe

1
@Robertico: Bạn thêm giá trị boolean là true vào tham số thứ ba của WriteAllBytes. Bạn đã khám phá ra MSDN chưa? Đây là liên kết google đầu tiên khi tìm kiếm phần nối thêm WriteAllBytes.

1
Tôi đã nhận được lỗi khi thêm giá trị boolean 'Không có quá tải cho phương thức' WriteAllBytes 'nhận' 3 'đối số'. MSDN mô tả: 'Tuy nhiên, nếu bạn đang thêm dữ liệu vào tệp bằng vòng lặp, một đối tượng BinaryWriter có thể cung cấp hiệu suất tốt hơn vì bạn chỉ phải mở và đóng tệp một lần.' Tôi đang sử dụng một vòng lặp. Tôi sử dụng ví dụ từ @ 0A0D và thay đổi 'FileMode.Create' thành 'FileMode.Append'.
John Doe

3

Thử đi:

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

Thx, điều này cũng hoạt động tốt. Làm cách nào để nối các byte vào cùng một tệp? (sau 'chuỗi' đầu tiên)
John Doe

2

Bạn chuyển đổi chuỗi hex thành một mảng 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();
}

Tín dụng: Jared Par

Và sau đó sử dụng WriteAllBytes để ghi vào hệ thống tệp.


1
Nếu bạn đang tham chiếu một câu trả lời Stack Overflow hiện có làm câu trả lời cho câu hỏi này, thì sẽ khá an toàn rằng đây là một câu hỏi trùng lặp và nên được gắn cờ như vậy.
ChrisF

1
Trong trường hợp này, nó chỉ trả lời một phần câu hỏi của anh ấy, vì vậy tôi cảm thấy nó không cần phải được đánh dấu là một bản dupe. Anh ấy sẽ chỉ đi được nửa chặng đường với kiến ​​thức đó.
Khepri

0

Ví dụ này đọc 6 byte vào một mảng byte và ghi nó vào một mảng byte khác. Nó thực hiện một thao tác XOR với các byte để kết quả được ghi vào tệp giống với các giá trị bắt đầu ban đầu. Tệp luôn có kích thước 6 byte, vì nó ghi ở vị trí 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();
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.