2012-12-14 28 views
5

Tôi muốn nạp dữ liệu vào một chương trình C với một kịch bản perl như thế này ./cprogram $(perl -e 'print "\xab\xcd\xef";').Làm thế nào tôi có thể để perl diễn giải một biến chuỗi đại diện cho một địa chỉ

Tuy nhiên, chuỗi phải được đọc từ tệp. Vì vậy, tôi nhận được một cái gì đó như thế này: ./cprogram $(perl -e 'open FILE, "<myfile.txt"; $file_contents = do { local $/; <FILE> }; print $file_contents'. Tuy nhiên, bây giờ perl diễn giải chuỗi là chuỗi "\xab\xcd\xef" và tôi muốn nó diễn giải nó như là chuỗi byte như trong ví dụ đầu tiên.

Làm cách nào để đạt được điều này? Nó phải được chạy trên một máy chủ mà không có File :: Slurp.

Trả lời

5

Trong trường hợp đầu tiên, bạn chuyển ba byte AB CD EF (được tạo bởi chuỗi ký tự "\xAB\xCD\xEF") đến print.

Trong trường hợp thứ hai, bạn phải chuyển thứ gì đó khác với ba byte đó đến print. Tôi nghi ngờ bạn đang chuyển chuỗi mười hai ký tự \xAB\xCD\xEF đến print.

Vì vậy, câu hỏi của bạn sẽ trở thành: Làm thế nào để chuyển đổi chuỗi 12 ký tự \xAB\xCD\xEF thành ba byte AB CD EF. Vâng, bạn muốn yêu cầu một số loại phân tích cú pháp như

s/\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)/ 
    $1 ? chr(hex($1)) : $2 ? $2 : $3 
/eg 

Và ở đây nó là tại nơi làm việc:

$ perl -e'print "\\xAB\\xCD\\xEF";' >file 

$ echo -n "$(perl -0777pe' 
    s{\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)}{ 
     $1 ? chr(hex($1)) : $2 // $3 
    }eg; 
    ' file)" | od -t x1 
0000000 ab cd ef 
0000003 
+0

Xin lỗi, byte NUL chỉ là tôi nhập chuỗi ví dụ ngu ngốc nhất từ ​​trước tới giờ. Trong trường hợp thực tế của tôi không có byte NUL. – codd

+0

@codd, tôi đã xóa NUL khỏi câu hỏi của bạn và tôi đã xóa nhận xét tương ứng khỏi câu trả lời của tôi. Tôi cũng đưa ra lời giải thích của tôi một chút. – ikegami

+0

Xin lỗi vì đã chấp nhận muộn, hoàn toàn quên mất nó. – codd

0

sử dụng một thủ thuật bash:

perl -e "$(echo "print \"$(cat input)"\")" 

mà ví dụ của bạn trở nên :

./cprogram "$(perl -e "$(echo "print \"$(cat myfile.txt)"\")")" 
+0

... wow, tôi vừa mới nhận thấy rằng bạn mong đợi toàn bộ tập tin được lưu trữ hex? Nếu đúng như vậy, nhận xét trước của tôi sẽ không áp dụng, nhưng tôi thấy khó mà tin được như vậy. – ikegami

+1

Đơn giản? './cprogram" $ (perl -0777pe '$ _ = eval qq {"$ _"}; chết $ @ nếu $ @' myfile.txt) "' – ikegami

0

Là đánh giá của Perl quá vil? Nếu không, hãy kết thúc bằng số print eval("\"$file_contents\"");

Hoặc bạn có thể chuẩn bị trước tệp bằng Perl không? EG print FILE "\xAB\xCD\xED"; sau đó đọc tệp kết quả bằng mã hiện có của bạn.

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