2009-07-28 37 views
10

Tôi đang cố gắng gửi một chuỗi byte nhị phân trên một ổ cắm, để đáp ứng một tiêu chuẩn cụ thể mà công ty của tôi sử dụng. Không ai trong công ty của tôi đã sử dụng Ruby cho điều này trước đây, nhưng trong các ngôn ngữ khác, họ gửi dữ liệu trên một byte tại một thời điểm, (thường là với một số loại "gói" phương pháp).Ruby xử lý byte/nhị phân như thế nào?

Tôi không thể tìm thấy bất kỳ cách nào để tạo nhị phân khi đang chạy hoặc tạo byte (gần nhất tôi có thể tìm thấy cách bạn có thể biến chuỗi thành các byte đại diện cho các ký tự của nó).

Tôi biết bạn có thể nói cái gì đó như:

@var = 0b101010101

Nhưng làm thế nào tôi sẽ chuyển đổi một chuỗi theo hình thức "101.010.101" hoặc số nguyên kết quả tạo ra khi tôi làm string.to_i (2) vào một nhị phân thực tế. Nếu tôi chỉ gửi chuỗi trên một ổ cắm, sẽ không phải chỉ cần gửi ASCII cho "0" và "1" thay vì các ký tự chữ?

Chắc chắn có một số cách để làm điều này một cách tự nhiên trong Ruby?

Trả lời

10

Để thực hiện một chuỗi có một chuỗi tùy ý của byte, làm một cái gì đó như thế này:

binary_string = "\xE5\xA5\xBD" 

Các "\ x" là một lối thoát đặc biệt để mã hóa một byte tùy ý từ hex, vì vậy " \ xE5 "nghĩa là byte 0xE5.

Sau đó thử gửi chuỗi đó trên ổ cắm.

+0

Tại sao có một số "/" trong binary_string? – why

+2

Có thể một chuỗi nhị phân có một byte có giá trị 0x2F (47). Đó là mã ASCII của "/" vì vậy nếu bạn 'kiểm tra' chuỗi Ruby thường sẽ in ra một"/". Điều tương tự cũng xảy ra đối với bất kỳ ký tự ASCII nào. Ruby không thực sự biết nếu chuỗi của bạn là một "chuỗi nhị phân", để chuỗi của bạn về cơ bản là một chuỗi các byte (ngoại trừ trong 1,9 họ đã thêm một số thông tin mã hóa). –

+0

Cảm ơn! nó giúp tôi rất nhiều – why

9

Hãy xem phương thức String.unpack. Đây là ví dụ:

str = "1010" 
str.unpack("cccc") 
=> [49, 48, 49, 48] 

Điều này sẽ cung cấp cho bạn giá trị nguyên. Có nhiều cách để thực hiện chuyển đổi hơn.

+0

Trước khi bài đăng này được chỉnh sửa, nó đã cho tôi biết về Array.pack. Tôi không hoàn toàn hiểu điều này. Nếu tôi có: @bob = ["111111111", "1000", "1111"] hoặc bất kỳ thứ gì và sau đó tôi nói: @ bob.unpack (b *), nó hiển thị nội dung như: "/ 377" Đó có phải là nhị phân chính xác không? Đó không phải là yếu tố đầu tiên của mảng sao? Làm thế nào tôi có nó làm toàn bộ mảng? – Jenny

+0

Array.pack là đối diện của String.unpack. Trong ví dụ bob.pack ('b *') của bạn chỉ đóng gói phần tử đầu tiên của mảng. Bạn có thể muốn bob.pack ('b * b * b *'). Tuy nhiên đây là một cái gì đó khác với những gì bạn đang yêu cầu trong câu hỏi. – kgiannakakis

14

Không biết nếu điều này có đủ, nhưng bạn có thể lập chỉ mục các bit trong một số nguyên trong ruby.

n = 0b010101 

n # => 21 

n = 21 

n[0] # => 1 
n[1] # => 0 
n[2] # => 1 
n[3] # => 0 
n[4] # => 1 
n[5] # => 0 
Các vấn đề liên quan