2012-12-10 61 views
5

Tôi đang sử dụng Ruby và tôi đang kết nối với điểm cuối mạng yêu cầu định dạng 'tiêu đề' trước khi gửi tin nhắn.Ruby - Cách biểu diễn chiều dài tin nhắn là 2 byte nhị phân

Trường đầu tiên trong tiêu đề phải là độ dài tin nhắn được xác định là chiều dài tin nhắn byte nhị phân trong thứ tự byte mạng.

Ví dụ: tin nhắn của tôi dài 1024. Làm cách nào để biểu thị 1024 dưới dạng nhị phân hai byte?

Trả lời

5

Các công cụ chuẩn để sắp xếp byte trong Ruby (và Perl và Python và ...) là packunpack. Ruby's pack is in Array. Bạn có độ dài phải dài hai byte và theo thứ tự byte mạng, có vẻ giống như một công việc cho thông số định dạng n:

n | Số nguyên | 16-bit unsigned, mạng (lớn-endian) thứ tự byte

Vì vậy, nếu chiều dài là trong length, bạn sẽ nhận được hai bạn byte thusly:

two_bytes = [ length ].pack('n') 

Nếu bạn cần phải làm ngược lại , hãy xem String#unpack:

length = two_bytes.unpack('n').first 
4

Xem Array#pack.

[1024].pack("n") 

Số này bao gồm số thứ tự byte mạng thứ tự \x04\x00.

Cách này hoạt động là mỗi byte là 8 bit nhị phân. 1024 ở dạng nhị phân là 10000000000. Nếu chúng ta chia nhỏ thành tám octet 8 (8 bit mỗi byte), chúng ta sẽ nhận được: 00000100 00000000.

Một byte có thể biểu thị (2 trạng thái)^(8 vị trí) = 256 giá trị duy nhất. Tuy nhiên, vì chúng ta không có 256 ký tự ascii có thể in, chúng ta biểu thị byte dưới dạng cặp thập lục phân, vì chữ số thập lục phân có thể đại diện cho 16 giá trị khác nhau và 16 * 16 = 256. Vì vậy, chúng ta có thể lấy byte đầu tiên, 00000100 và ngắt nó thành hai tứ giác thập lục phân là 0000 0100. Dịch nhị phân sang hex cung cấp cho chúng tôi 0x04. Byte thứ hai là tầm thường, như 0000 00000x00. Điều này cho chúng ta biểu diễn hệ thập lục phân của chúng ta về chuỗi hai byte.

Cần lưu ý rằng vì bạn bị giới hạn ở tiêu đề 2 byte (16 bit), bạn bị giới hạn ở giá trị tối đa là 11111111 11111111 hoặc 2^16 - 1 = 65535 byte. Bất kỳ thông báo nào lớn hơn thông điệp không thể đại diện chính xác chiều dài của nó theo hai byte.

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