2014-04-09 34 views
18

Tôi có một chuỗi chứa các giá trị mã hex của các ký tự ASCII, ví dụ: "666f6f626172". Tôi muốn chuyển nó thành chuỗi tương ứng ("foobar").Chuyển đổi chuỗi có mã ASCII hex thành các ký tự

Đây là làm việc nhưng xấu xí:

"666f6f626172".scan(/../).map(&:hex).map(&:chr).join # => "foobar" 

Có (ngắn gọn hơn) cách tốt hơn? unpack có hữu ích không?

+7

Giống như '[ "666f6f626172"] gói ('H *')'.? – Stefan

+1

@Stefan. Vâng, như thế. Bạn có thể vui lòng đăng bài này làm câu trả lời không? –

Trả lời

36

Bạn có thể sử dụng Array#pack:

["666f6f626172"].pack('H*') 
#=> "foobar" 

H là chỉ thị cho một chuỗi hex (cao nibble đầu tiên).

+15

'pack' /' unpack' sẽ vẫn là bí ẩn đối với tôi mãi mãi. –

14

Stefan đã đóng đinh nó, nhưng đây là một sự thay thế bạn có thể muốn gài xa cho một thời gian và địa điểm:

"666f6f626172".gsub(/../) { |pair| pair.hex.chr } # => "foobar" 
Các vấn đề liên quan