Ý nghĩa của việc vá các tệp nhị phân?


7

Tôi đang cố gắng hiểu ý nghĩa của nó bằng cách vá các tệp nhị phân trong một ví dụ từ trang chủ của xxd:

Patch the date in the file xxd.1
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36  25th May 1996
  1. Nó có nghĩa là chỉnh sửa các tệp nhị phân, hay nó giống như trong Wikipedia

    Bản vá là một phần mềm được thiết kế để khắc phục sự cố 1 với hoặc cập nhật chương trình máy tính hoặc dữ liệu hỗ trợ của nó.

  2. Làm thế nào xxdpatchkhác nhau, và chúng có giống nhau không?
  3. Ví dụ cố gắng làm gì?

Câu trả lời:


12

Để vá một tệp có nghĩa là sửa đổi nó, với ý nghĩa rằng sửa đổi nói chung là nhỏ. Việc sử dụng xuất phát từ cách sử dụng tiếng Anh thông thường trong đó một bản vá là một sửa đổi nhỏ (ví dụ như một mảnh vải). Khi nói đến các tập tin, một bản vá không phải luôn luôn là một sửa chữa.

Một bản vá là một chuỗi các hướng dẫn mô tả cách sửa đổi một tệp hoặc một tập hợp các tệp. Trong thế giới unix, một bản vá thường là đầu ra của difflệnh, mô tả các thay đổi trong tệp văn bản. Một bản vá theo nghĩa này mô tả các sửa đổi về mặt thêm, xóa hoặc sửa đổi các dòng trong các tệp. Các patchtiện ích được áp dụng những hướng dẫn này để sửa đổi một tập tin hoặc tập hợp các tập tin. Nó cố gắng thông minh về việc áp dụng nhiều bản vá cho cùng một tệp, vì bản vá đầu tiên có thể gây ra những thay đổi ngăn không cho bản thứ hai được áp dụng vì tệp không còn ở trạng thái mong đợi. Bởi vì diffpatchmạnh mẽ dựa trên hoạt động của họ trên các dòng, chúng không phù hợp với các tệp nhị phân.

xxdlà một tiện ích chung để làm việc với các tệp nhị phân. Một trong những khả năng của nó là thực hiện các sửa đổi trong một tệp. Ví dụ, lệnh xxd -r - xxd.1có nghĩa là áp dụng các sửa đổi được mô tả trên đầu vào tiêu chuẩn. Bản vá ví dụ (nghĩa là hướng dẫn sửa đổi) 0000037: 3574 68có nghĩa là: bắt đầu ở phần bù 0x37(nghĩa là 55 trong số thập phân), thay thế ba byte tiếp theo bằng 0x35, 0x74 và 0x68 (tức là ba ký tự 5th).


4

Khi bạn áp dụng một bản vá cho một tệp, bạn đang ghi đè lên một phần của nó với dữ liệu được cập nhật (một bản vá cũng có thể xử lý dữ liệu bổ sung vào cuối). Bạn có thể vá bất kỳ loại tệp nào, cho dù đó là văn bản, nhị phân hay bất cứ thứ gì, bởi vì tất cả các tệp là các luồng byte khi nó đi xuống.

Các phần của nó được cho là ghi đè được chỉ định trong tệp vá.

Nếu sửa lỗi phần mềm liên quan đến việc cập nhật tệp, một bản vá có thể sửa đổi tệp giống như phiên bản đầy đủ của tệp được cập nhật. Vì các bản vá không phải là tệp đầy đủ, nhưng chỉ là sự khác biệt, các bản vá sẽ nhỏ hơn, tiêu thụ ít dung lượng đĩa hơn và tiêu thụ ít băng thông hơn khi tải xuống.

Chỉnh sửa trực tiếp tệp nhị phân trong trình soạn thảo hex (chẳng hạn như hexer) đôi khi được gọi là vá "thủ công".

Tôi không quen thuộc xxd, nhưng có vẻ như từ tìm kiếm sơ bộ xxdcó thể tạo ra một danh sách kết xuất hoặc hex của dữ liệu nhị phân và cũng có thể chuyển đổi một danh sách đó thành nhị phân thẳng. Vì vậy, bạn có thể kết xuất hex với xxd, chỉnh sửa nó bằng vimhoặc một trình soạn thảo văn bản khác và viết lại các thay đổi bằng một xxd -r. Bạn cũng có thể đường ống nó một chuỗi sử dụng echotrong xxd"định dạng hexdump." (Các tùy chọn khác cho phép bạn thực hiện các thay đổi đối với tệp nhị phân. Có vẻ như xxdcó rất nhiều tùy chọn cho phép bạn chỉ định nơi bắt đầu và dừng ghi đè hoặc vá lỗi.)

Lệnh đầu tiên trong ví dụ về cơ bản là yêu xxdcầu thay đổi các byte trong tệp xxd.1bắt đầu từ offset 0x0000037thành 0x35 0x74 0x68(ASCII cho "5"). xxdcó thể đọc định dạng "hexdump" của riêng nó và đó là những gì lệnh "echo" đang cung cấp xxd.

Lệnh thứ hai trong ví dụ là kết xuất số đếm ( -c) 13 byte trong tệp bắt đầu từ cùng một giá trị bù.

Các patchlệnh làm một điều tương tự, nhưng nó muốn tập tin trong một định dạng "khác". Bạn có thể tạo một tệp diff bằng cách lưu đầu ra của difflệnh, nó sẽ so sánh hai tệp và thể hiện sự khác biệt trong định dạng diff đã nói. Từ việc đọc mantrang, có vẻ như bản vá có ý nghĩa nhiều hơn đối với việc thay đổi tệp văn bản hơn là nhị phân thẳng.


2

Trên vi điều khiển, đôi khi bạn có các chương trình, làm thay đổi bộ nhớ chương trình, nghĩa là chính chương trình đó. Bạn có thể nói chương trình "đột biến" khi nó chạy.

Đây chỉ là một lời giải thích cho việc thay đổi các ứng dụng nhị phân.

Trong thực tế, bạn sử dụng vá nhị phân khá thường xuyên trong các chương trình vi điều khiển. Vì chương trình của bạn là mã máy, và thường xuyên hơn không, bạn đang lập trình trong trình biên dịch chương trình, mã máy được lắp ráp là đại diện trực tiếp cho những gì bạn đã lập trình. Vì vậy, một khi mã của bạn được lắp ráp, bạn chỉ cần cung cấp các bản vá cho một số hoặc tất cả bộ nhớ chương trình vi điều khiển.

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.