2012-02-04 45 views
6

Tôi có một số giá trị hex mà tôi cố gắng ghi vào tệp. Có vẻ như Lua không ủng hộ điều đó, vì tất cả chúng đều được coi là chuỗi thay vì giá trị. Tôi figured tôi sẽ phải phá vỡ một giá trị hex dài hơn, ví dụ AABBCC vào AA, BB, CC và sử dụng string.char() trên tất cả các giá trị thập phân của họ liên tiếp để có được công việc làm.Lua: viết giá trị thập lục phân dưới dạng tệp nhị phân

Có chức năng tích hợp sẵn cho phép tôi viết trực tiếp các giá trị đó mà không cần chuyển đổi chúng trước không? Tôi đã sử dụng các ký tự thoát như "0xAA" và "\ xAA", nhưng các ký tự đó không hoạt động.

Chỉnh sửa: Hãy để tôi cung cấp cho bạn một ví dụ. Tôi đang nhìn vào một tập tin thử nghiệm trong một trình soạn thảo hex:

00000000 00 00 00 00 00 00 ...... 

Và tôi muốn viết thư cho nó trong thời trang sau đây với chuỗi "aabbcc":

00000000 AA BB CC 00 00 00 ...... 

gì tôi nhận được dù với các nhân vật thoát là:

00000000 41 41 42 42 43 43 AABBCC 

Trả lời

23

tôi sử dụng các chức năng sau để chuyển đổi giữa một chuỗi hex và "nhị phân thô":

function string.fromhex(str) 
    return (str:gsub('..', function (cc) 
     return string.char(tonumber(cc, 16)) 
    end)) 
end 

function string.tohex(str) 
    return (str:gsub('.', function (c) 
     return string.format('%02X', string.byte(c)) 
    end)) 
end 

Chúng có thể được sử dụng như sau:

("Hello world!"):tohex()    --> 48656C6C6F20776F726C6421 
("48656C6C6F20776F726C6421"):fromhex() --> Hello world! 
+0

Hoàn hảo! Chỉ cần những gì tôi đang tìm kiếm. Cảm ơn rất nhiều! – Zerobinary99

+0

Giải pháp này dường như thêm giá trị hex 0c0D (hoặc 13) vào một số địa điểm, dường như là ngẫu nhiên. Nó rất gần với những gì tôi cần. –

+1

Vâng, bạn có đang viết điều này trên Windows không? Nếu có, thì vấn đề nằm trong [ngắt dòng] (http://en.wikipedia.org/wiki/Line_break_ (máy tính)). Trong khi trên Unix/Linux/Mac OS X dòng mới được biểu diễn bằng đơn '\ n' = 0x0A, trên Windows khi bạn nhập một dòng mới, nó nhúng hai byte - 0x0D, 0x0A (13 10, CR + LF).Đây có thể là lý do tại sao bạn nhìn thấy 0x0D ở những nơi ngẫu nhiên. Hãy thử để xem nếu nó là gần 0x0A - nếu đây là trường hợp, sử dụng công cụ chuyển đổi để chuyển đổi sang phong cách Unix (đơn '\ n'). –

2

Vì vậy, bạn có một chuỗi như thế này:

value = 'AABBCC' 

Và bạn muốn in nó (hoặc biến nó thành một chuỗi) như thế này?

'101010101011101111001100' 

Làm thế nào về điều này?

function hex2bin(str) 
    local map = { 
     ['0'] = '0000' 
     ['1'] = '0001' 
     ['2'] = '0010' 
     -- etc. up to 'F' 
    } 
    return str:gsub('[0-9A-F]', map) 
end 

Lưu ý rằng nó để lại bất kỳ ký tự nào không thể hiểu là hex.

+0

Không, tôi không muốn chuyển đổi dữ liệu thập lục phân, nhưng tôi muốn viết chuỗi thập lục phân dưới dạng giá trị thập lục phân thay vì một chuỗi. Hãy để tôi nâng cao câu hỏi trên của tôi. – Zerobinary99

2

Có chức năng như vậy bởi vì nó dễ dàng để viết một.

function writeHex(str,fh) 
    for byte in str:gmatch'%x%x' do 
     fh:write(string.char(tonumber(byte,16))) 
    end 
end 

Điều này chỉ ghi rõ giá trị vào tệp được tệp fh trỏ tay trỏ.

+0

Nó không hoạt động cho các giá trị hex được lưu trữ dưới dạng chuỗi. Định dạng nào "str" ​​cần phải cho điều này để hoạt động đúng? – Zerobinary99

+0

Vâng, vâng, bạn nói đúng, tôi đã phạm sai lầm trong mã. Sửa lỗi. – jpjacobs

+0

Tôi nghĩ rằng bạn có nghĩa là 'str: gmatch '% x% x'' vì'% X' là từ chối của những gì bạn đang tìm kiếm. – greatwolf

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