Macrolinux là đúng nhưng bạn phải cẩn thận với ví dụ của mình vì nó sẽ hoạt động nhưng vô tình.
Đối số đầu tiên để BinData() là BSON kiểu phụ nhị phân trong đó, như đã được đề cập là một trong những điều sau đây:
generic: \x00 (0)
function: \x01 (1)
old: \x02 (2)
uuid_old: \x03 (3)
uuid: \x04 (4)
md5: \x05 (5)
user: \x80 (128)
Đây chỉ là những người giúp đỡ để các deserializer có thể giải thích các dữ liệu nhị phân khác nhau tùy thuộc trên những gì các byte đại diện cho ngoại trừ cho loại phụ 2 giống như loại phụ chung nhưng lưu trữ int32 đại diện cho độ dài của mảng byte là 4 byte đầu tiên của dữ liệu.
Bây giờ để xem tại sao ví dụ này là sai, bạn sẽ lưu ý rằng gọi BinData (2, "1234") không lưu trữ nhị phân đại diện cho chuỗi "1234" vì hai lý do:
- Các BinData chức năng diễn giải chuỗi đó dưới dạng chuỗi được mã hóa base64.
- Loại 2 sẽ yêu cầu 4 byte đầu tiên là int32 chứa độ dài của mảng byte.
Xem bsonspec.org để biết thêm thông tin.
Nguồn
2013-04-03 17:33:00
Thú vị. Các kiểu con đó có được sử dụng cho bất kỳ thứ gì không? – Thilo
Tôi đoán vậy :-). Nơi tốt nhất để hỏi là nhóm BSON. Chắc chắn, có một lý do cho sự khác biệt giữa '\ x00' mới và lịch sử' \ x02' (http://groups.google.com/group/bson/browse_thread/thread/c45f78fba9311975). Đối với UUID và MD5 (ý kiến của tôi) là để tối ưu hóa. Cả hai đều có chiều dài cố định thập lục phân (16-byte/128-bit/32 chữ số thập lục phân, bit bố cục UUID khác nhau có '-') và được sử dụng rộng rãi, trình cài đặt trình điều khiển có thể tối ưu hóa việc đọc/ghi. –
Tôi không biết những gì một trình điều khiển có thể tối ưu hóa ở đây. Tất cả các kiểu nhị phân được lưu trữ dưới dạng các byte byte kiểu phụ (int32) * '. Cố định chiều dài hay không, chiều dài được lưu trữ. Và dữ liệu được lưu trữ dưới dạng byte thô (không phải hệ thập lục phân). Có lẽ một tùy chọn để xác thực dữ liệu? Hoặc cho mục đích hiển thị: UUID có thể được hiển thị đẹp hơn 'BinData (3, ........)'? – Thilo