Có an toàn khi sử dụng đầu vào và đầu ra tiêu chuẩn với dữ liệu nhị phân không?


14

Tôi cần chia một tệp nhị phân thành hai. Tôi đã tự hỏi nếu đầu và / hoặc đuôi có thể được sử dụng nhưng sau đó tôi tự hỏi ... nó có an toàn khi sử dụng chuyển hướng, đường ống vv với dữ liệu nhị phân không? Các dòng mới có bị rối với, hoặc null bị bỏ qua, hoặc xóa lùi hoặc xóa làm điều gì đó đặc biệt không? (bash, kubfox 18.04 LTS)


1
Hãy nhìn vào splitlệnh.
egmont

Câu trả lời:


19

Có, nó an toàn nếu bạn chuyển nó sang một quy trình khác hoặc lưu nó vào một tệp. Có khả năng "kỳ lạ" nếu bạn để thiết bị xuất chuẩn nhị phân in ra thiết bị đầu cuối vì nó có thể chứa các chuỗi thoát (ngẫu nhiên) có thể tạm thời làm rối màn hình thiết bị đầu cuối.


6
Trong trường hợp đó bạn có thể gõ resetvà nhấn enter để sửa nó.
Baard Kopperud

4
@BaardKopperud Tôi nghĩ rằng tôi đã đọc ở đâu đó về một số trường hợp góc mà tset / reset sẽ không hoạt động
Xen2050

1
@ Xen2050 tôi không biết. trường hợp duy nhất sẽ xảy ra nếu một số chuỗi thoát thay đổi bố cục / mã hóa bàn phím, do đó việc gõ reset<enter> không thực sự gõ chuỗi ký tự mà thiết bị đầu cuối nhìn thấy ...
Bakuriu 30/12/18

3
Xem thêm Fix thiết bị đầu cuối sau khi hiển thị một tập tin nhị phânTại sao giao diện điều khiển cần thiết đôi khi một thiết lập lại sau khi tổ hợp phím CTRL + C . Như được đề xuất trong liên kết đầu tiên, stty sane; tput rs1chuỗi lệnh sẽ thực hiện thủ thuật khi có các trường hợp góc resetkhông hoạt động. Các trường hợp như vậy, ngoài Bakuriu đã đề cập, có thể bao gồm chiều rộng của dòng / cột thiết bị đầu cuối hoặc tôi đoán các cài đặt liên quan đến giao tiếp nối tiếp (baudrate / parity).
Sergiy Kolodyazhnyy

1

Vấn đề chính với việc sử dụng các lệnh như headhoặc taillà chúng là các tệp nhị phân hướng và dòng không. Nếu chúng có dòng mới trong chúng, chúng thường không được sử dụng để thể hiện phần cuối của dòng và nếu có, chúng có thể chỉ là một phần của chuỗi như thông điệp chương trình hoặc trường dữ liệu.

Nếu dữ liệu được cấu trúc theo bất kỳ cách nào, thì bạn phải tính đến điều đó trong việc chọn các điểm phân tách để bạn không phá vỡ các cấu trúc ở giữa.

Nếu bạn biết cấu trúc của tệp, bạn có thể sử dụng một lệnh như

dd -if input-file -of output-file ...

với các tùy chọn chỉ sao chép rất nhiều khối dữ liệu có kích thước cụ thể bắt đầu ở phần bù (tăng) cụ thể vào tệp.

Có vẻ như splitlệnh được đề cập bởi @egmont sẽ tự động hóa quy trình này cho bạn, nhưng nó dường như được định hướng theo dòng theo mặc định, vì vậy bạn sẽ phải chỉ định các tùy chọn bổ sung như --bytes countđể cho biết mỗi phần của tệp nên lớn đến mức nào là.


Một lưu ý phụ, nếu bạn không biết những gì trong một tệp, nhưng nghi ngờ nó chứa ít nhất một số dữ liệu văn bản có ý nghĩa, thì stringslệnh là một cách tuyệt vời để có cái nhìn đầu tiên để xem bạn đang xử lý vấn đề gì.

strings -n 6 file | less

sẽ tìm thấy tất cả các ký tự có thể in ít nhất sáu ký tự và hiển thị chúng trong máy nhắn tin để chúng không bay trên thiết bị đầu cuối. Sử dụng một số lớn hơn một chút so với 4 ký tự mặc định sẽ giúp loại bỏ các đoạn dữ liệu nhỏ có thể in được, nhưng không được sử dụng theo cách đó trong tệp.

Nếu sau này bạn phải khám phá tệp chi tiết hơn với trình chỉnh sửa nhị phân, chẳng hạn như hexedit, bạn sẽ có một số mốc chỉ ra nơi có thể tìm thấy thứ gì đó thú vị.

stringscó một tùy chọn - t x sẽ đi trước mỗi chuỗi được in với phần bù của nó vào tệp theo hệ thập lục phân (o cho số bát phân / d cho số thập phân) để bạn biết nơi tìm thấy nó sau. Ngay cả các tệp rất ngắn cũng có rất nhiều vấn đề khi bạn phải xem chúng theo từng ký tự.

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.