2015-04-28 40 views
5

Tôi đang viết bộ mã hóa/giải mã BASE64 của riêng mình cho một số môi trường bị hạn chế.Tại sao Base64 của JDK8 sử dụng ISO-8859-1?

Và tôi thấy rằng Base64.Encoder#encodeString nói rằng nó sử dụng ISO-8859-1 để tạo chuỗi từ các byte được mã hóa đó.

Tôi hoàn toàn giả định rằng ISO-8859-1 bộ ký tự cũng bao gồm tất cả các bảng chữ cái base64.

Có lý do nào có thể không sử dụng US-ASCII không?

Trả lời

7

tôi nghi ngờ nó hiệu quả hơn: chuyển đổi từ ISO-8859-1 trở lại văn bản là chỉ một vấn đề của việc thúc đẩy mỗi byte thẳng đến một char, trong khi cho ASCII bạn cần phải xem xét rằng việc byte là ASCII hợp lệ . Kết quả cho base64 sẽ luôn luôn giống nhau, tất nhiên.

(Đó chỉ là phỏng đoán, nhưng là một giáo dục. Bạn luôn có thể chạy điểm chuẩn nếu bạn muốn xác thực nó ...)

+1

Mã chứng minh bạn đúng. [Implementation] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/Base64.java#Base64.Encoder.encodeToString%28byte%5B % 5D% 29) trực tiếp ủy quyền cho ['String (byte [] ascii, int hibyte, int offset, int count)'] (http://docs.oracle.com/javase/8/docs/api/java/lang /String.html#String-byte:A-int-int-int-), một hàm tạo không được dùng vì nó chỉ hữu ích cho việc sử dụng 'hibyte == 0' (đọc iso-latin-1), trong đó có một vòng lặp sao chép được tối ưu hóa. Đó là cách sử dụng hợp lý và được tối ưu hóa trong trường hợp cụ thể này. – Holger

+1

Mặc dù nó sẽ hoạt động tốt nếu tài liệu * đã nói rằng nó đang sử dụng US-ASCII trong khi sử dụng cùng một triển khai. Nhưng nói “ISO-8859-1” trong tài liệu là một con trỏ tốt cho những người triển khai tiềm năng, gợi ý rằng việc sử dụng iso-latin-1 được ưa thích hơn khi sử dụng ASCII tại đây… – Holger

+1

@Holger: Và sẽ rất khó hiểu đối với bất kỳ ai * đang tìm kiếm * tại triển khai và các tài liệu với nhau :) –

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