Tại sao cơ sở64 của một chuỗi có chứa GIỚI THIỆU?


84
$ echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64
YXBmanhraWMtb215dW9id2QzMzk4MDVhazo2MGEwNmNkMmRkZmFkNjEwYjk0OTBkMzU5ZDYwNTQw
Nw==

Đầu ra có một sự trở lại trước Nw==. Cách chính xác để tạo base64 trong Linux là gì?

ảnh chụp màn hình thiết bị đầu cuối


5
Bạn có chắc chắn đầu ra chứa một dòng mới, và nó không chỉ là gói cửa sổ của bạn? Lệnh đó đã làm việc tốt cho tôi trên mac. Bạn đang sử dụng hệ điều hành nào?
Ian

47
RFC 2045, được xác định Base64, YÊU CẦU một dòng mới sau 76 ký tự (tối đa). Điều gì khiến bạn nghĩ rằng ví dụ của bạn không phải là cách chính xác?
MSalters

24
@MSalters RFC 4648 đặc biệt giải quyết vấn đề đó. Việc triển khai KHÔNG PHẢI thêm nguồn cấp dữ liệu vào dữ liệu được mã hóa cơ sở trừ khi thông số kỹ thuật tham chiếu đến tài liệu này chỉ đạo rõ ràng bộ mã hóa cơ sở để thêm nguồn cấp dữ liệu sau một số ký tự cụ thể. => việc triển khai này không chính xác theo RFC 4648, miễn là nó tuyên bố sẽ tạo ra đầu ra được mã hóa 'base64'. Thú vị hơn, các trang web GNU base64 (trong câu hỏi?) Đề cập cụ thể đến RFC 3548, cũng chỉ định không có gói theo mặc định và RFC 4648 đã lỗi thời.
Bob

4
@Bob: RFC có một chút ít tôn trọng tính ổn định của API; một công cụ base64 không thể thay đổi định dạng đầu ra mà không phá vỡ các tập lệnh.
MSalters

2
@MSalters Tôi không thể chắc chắn một phiên bản cũ hơn không tồn tại, nhưng GNU base64 đã được viết vào năm 2004 và AFAICT luôn tuyên bố tuân theo RFC 3548. RFC 3548 có cùng điều khoản "PHẢI KHÔNG thêm nguồn cấp dữ liệu". Vì vậy, ngay cả việc thực hiện ban đầu là "sai". Ít nhất, việc thực hiện nó không phù hợp với tài liệu của nó. Dù sao, bạn đã hỏi tại sao ví dụ của OP là chính xác và tham chiếu RFC; Phản hồi của tôi là RFC chính xác thực sự xác định Base64 trong sự cô lập. Nếu câu trả lời của bạn là "vì lý do lịch sử", thì cũng vậy, nhưng OP không sai ở đây.
Bob

Câu trả lời:


151

Thử:

echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 -w 0

Từ man base64:

-w, --wrap=COLS
Bọc các dòng được mã hóa sau COLSký tự (mặc định 76). Sử dụng 0để vô hiệu hóa gói dòng.


17
Người đàn ông, tôi luôn luôn chỉ cần thông qua này tr. Thật tốt khi biết có một "cách thích hợp".
Điểm_Under

Giải thích về lý do tại sao giá trị mặc định không bằng 0 là một điều sai lầm đối với tôi.
Dherik

1
@Dherik Tôi đoán đó là phép lịch sự đối với các công cụ xử lý văn bản. base64mã hóa dữ liệu nhị phân tùy ý dưới dạng văn bản. Các công cụ mong đợi văn bản thường đọc một dòng tại một thời điểm và có thể không xử lý tốt các dòng rất dài . Nếu -w 0là mặc định, bạn sẽ nhận được theo mặc định chỉ một dòng văn bản; một dòng rất dài nếu đầu vào lớn. Mặc định tốt hơn là bọc. Tôi nghĩ rằng 76đã được lựa chọn bởi vì nó ít ít hơn 80đó là một loại tiêu chuẩn de-facto cho thiết bị đầu cuối .
Kamil Maciorowski

@KamilMaciorowski cảm ơn bạn đã thông tin. Mỗi lần tôi sử dụng base64lệnh tôi cần để vượt qua -w 0(và khi tôi quên, những điều kỳ lạ có thể xảy ra ...), vì vậy hành vi mặc định này rất lạ đối với tôi.
Dherik

54

Điều này kém hơn câu trả lời của Kamil trên các hệ thống hỗ trợ -wtùy chọn này base64, nhưng đối với các trường hợp khi không có sẵn (ví dụ: Alpine Linux, initramfshook Arch Linux , v.v.), bạn có thể xử lý thủ công đầu ra của base64:

base64 some_file.txt | tr -d \\n

Đây là cách tiếp cận vũ phu; thay vì để chương trình hợp tác, tôi đang sử dụng trđể bóc tách bừa bãi mọi dòng mới trên thiết bị xuất chuẩ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.