2010-07-10 55 views
9

Vì vậy, đây là vấn đề của tôi. Tôi có một tệp nhị phân mà tôi muốn chỉnh sửa. Tôi có thể sử dụng một trình soạn thảo hex để chỉnh sửa nó tất nhiên, nhưng tôi cần phải thực hiện một chương trình để chỉnh sửa tập tin cụ thể này. Nói rằng tôi biết một số hex tôi muốn chỉnh sửa, tôi biết địa chỉ của nó, vv Hãy nói rằng đó là một nhị phân 16-bit, và địa chỉ là 00000000, nó ở hàng 04 và nó có giá trị là 02. Làm thế nào tôi có thể tạo một chương trình có thể thay đổi giá trị của hex đó và chỉ hex đó bằng một lần nhấn nút?Cách chỉnh sửa giá trị hex của tệp nhị phân bằng C#

Tôi đã tìm thấy các tài nguyên nói về những điều tương tự, nhưng tôi không thể cho cuộc sống của tôi tìm trợ giúp về vấn đề chính xác.

Bất kỳ trợ giúp nào sẽ được đánh giá cao và vui lòng không chỉ cho tôi biết câu trả lời nếu có câu trả lời mà hãy thử và giải thích một chút.

+0

Tôi có nhận được nó correclty mà bạn muốn ghi đè lên một vài byte tại một địa điểm được đưa ra trong một tập tin đã có trên đĩa? –

Trả lời

21

Tôi nghĩ rằng đây là giải thích tốt nhất với một ví dụ cụ thể. Dưới đây là 32 byte đầu tiên của tệp thi hành như được hiển thị trong trình chỉnh sửa hex của Visual Studio:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 

Bây giờ một tệp thực sự chỉ là một chuỗi tuyến tính. Các hàng mà bạn thấy trong trình chỉnh sửa hex chỉ có ở đó để giúp mọi thứ dễ đọc hơn. Khi bạn muốn thao tác các byte trong một tệp bằng mã, bạn cần xác định các byte theo vị trí dựa trên 0 của chúng. Trong ví dụ trên, vị trí của các byte khác không như sau:

Position Value 
-------- ------ 
    0  0x4D 
    1  0x5A 
    2  0x90 
    4  0x03 
    8  0x04 
12  0xFF 
13  0xFF 
16  0xB8 
24  0x40 

trong các đại diện trình soạn thảo hex hiển thị ở trên, những con số ở bên trái đại diện cho vị trí của các byte đầu tiên trong dòng tương ứng. Trình chỉnh sửa hiển thị 16 byte trên mỗi dòng, vì vậy chúng tăng 16 (0x10) tại mỗi dòng.

Nếu bạn chỉ muốn lấy một trong các byte trong tệp và thay đổi giá trị của nó, cách tiếp cận hiệu quả nhất mà tôi thấy là mở tệp bằng FileStream, tìm đến vị trí thích hợp và ghi đè byte. Ví dụ, sau đây sẽ thay đổi 0x40 ở vị trí 24 đến 0x04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { 
    stream.Position = 24; 
    stream.WriteByte(0x04); 
} 
+0

Cảm ơn bạn rất nhiều, tôi đã có thể hoàn thành chương trình của mình với thông tin này. –

0

Điều đầu tiên có thể là hiểu các chuyển đổi. Hex đến thập phân có thể không quan trọng (trừ khi bạn cần thay đổi giá trị từ thập phân trước, nhưng đó là công thức chuyển đổi đơn giản), nhưng hex thành nhị phân sẽ quan trọng khi thấy mỗi ký tự hex (0-9, AF) tương ứng với đầu ra nhị phân cụ thể.

Sau khi hiểu nội dung đó, bước tiếp theo là tìm ra chính xác những gì bạn đang tìm kiếm, thực hiện chuyển đổi phù hợp và thay thế chuỗi chính xác đó. Tôi sẽ khuyên bạn nên (nếu bộ đệm sẽ không được quá lớn) để có toàn bộ hex dump và thay thế bất cứ điều gì bạn đang tìm kiếm trong đó để tránh ghi đè một chuỗi nhị phân trùng lặp.

Hy vọng điều đó sẽ hữu ích!

Kính trọng,
Dennis M.

Các vấn đề liên quan