2012-01-03 28 views
49

Tôi cần một tập lệnh/công cụ đọc một tệp nhị phân và xuất ra một mảng mã nguồn C/C++ (đại diện cho nội dung tệp). Có cái gì không?script/tool để chuyển đổi tập tin sang mảng mã nguồn C/C++


(Câu hỏi này đã bị xóa trước đó. Tôi đặt câu hỏi này lại vì nó rất có giá trị. Tôi đã tìm kiếm chính xác này trên Google và không tìm thấy bất cứ điều gì. Tất nhiên nó là tầm thường để mã hóa bản thân mình nhưng tôi có thể đã tiết kiệm được vài phút nếu tôi đã tìm thấy một kịch bản đơn giản như vậy, vì vậy nó rất có giá trị

Câu hỏi này cũng có rất nhiều phiếu giảm giá mà không có nhiều lời giải thích. không có giá trị hoặc giá trị xấu nào

Câu hỏi này cũng gây ra nhiều nhầm lẫn về những gì tôi đang hỏi về. không rõ, xin hỏi. Tôi thực sự không biết làm thế nào để làm cho nó rõ ràng hơn. Xem câu trả lời cho ví dụ.

Ngoài ra (sau khi đặt câu hỏi ở đây), tôi đã có một số câu trả lời. Tôi chỉ muốn đặt/liên kết chúng ở đây (một lần nữa) vì tôi nghĩ rằng nó có thể có ích cho người khác tìm kiếm này)

+2

Có thể mọi người hiểu rằng bạn muốn có một loại trình giải mã hoặc công cụ tương tự. Bạn có thể gọi lại nó là "đọc một tệp nhị phân và xuất ra một khai báo C/C++ của một mảng được khởi tạo thành nội dung của tệp" hoặc một cái gì đó tương tự. –

Trả lời

82

On Debian và khác distro Linux được cài đặt theo mặc định (cùng với vim) công cụ xxd, trong đó, cung cấp tùy chọn -i, có thể làm những gì bạn muốn:

[email protected]:~/Desktop$ echo Hello World\! > temp 
[email protected]:~/Desktop$ xxd -i temp 
unsigned char temp[] = { 
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21, 
    0x0a 
}; 
unsigned int temp_len = 13; 
+4

Ah tốt đẹp! Nó thậm chí có sẵn trong MacOSX. – Albert

+0

Chỉ là những gì tôi đang tìm :) cảm ơn! –

+2

không gặp sự cố khi tích hợp xxd vào giải pháp Visual Studio 2013 trên Windows. Tôi đã sử dụng [nguồn này] (http://www.opensource.apple.com/source/vim/vim-43/vim/src/xxd/xxd.c?txt) – Spike0xff

5

Một công cụ đơn giản có thể được tìm thấy here:.

#include <stdio.h> 
#include <assert.h> 

int main(int argc, char** argv) { 
    assert(argc == 2); 
    char* fn = argv[1]; 
    FILE* f = fopen(fn, "rb"); 
    printf("char a[] = {\n"); 
    unsigned long n = 0; 
    while(!feof(f)) { 
     unsigned char c; 
     if(fread(&c, 1, 1, f) == 0) break; 
     printf("0x%.2X,", (int)c); 
     ++n; 
     if(n % 10 == 0) printf("\n"); 
    } 
    fclose(f); 
    printf("};\n"); 
} 
+0

Bạn sẽ có thêm "," ở cuối mảng char trước "}" – rkosegi

+0

Đó không phải là vấn đề, nó biên dịch trong C++. – sashoalm

0

Công cụ này biên dịch tại dấu nhắc lệnh nhà phát triển trong C. Nó tạo ra đến thiết bị đầu cuối hiển thị nội dung trong tệp "array_name.c" được tạo. Lưu ý rằng một số thiết bị đầu cuối có thể hiển thị ký tự "\ b".

#include <stdio.h> 
    #include <assert.h> 

    int main(int argc, char** argv) { 
    assert(argc == 2); 
    char* fn = argv[1]; 

    // Open file passed by reference 
    FILE* f = fopen(fn, "rb"); 
    // Opens a new file in the programs location 
    FILE* fw = fopen("array_name.c","w"); 

    // Next two lines write the strings to the console and .c file 
    printf("char array_name[] = {\n"); 
    fprintf(fw,"char hex_array[] = {\n"); 

    // Declare long integer for number of columns in the array being made 
    unsigned long n = 0; 

    // Loop until end of file 
    while((!feof(f))){ 
     // Declare character that stores the bytes from hex file 
     unsigned char c; 

     // Ignore failed elements read 
     if(fread(&c, 1, 1, f) == 0) break; 
     // Prints to console and file, "0x%.2X" ensures format for all 
     // read bytes is like "0x00" 
     printf("0x%.2X,", (int)c); 
     fprintf(fw,"0x%.2X,", (int)c); 

     // Increment counter, if 20 columns have been made, begin new line 
     ++n; 
     if(n % 20 == 0){ 
      printf("\n"); 
      fprintf(fw,"\n"); 
     } 
    } 

    // fseek places cursor to overwrite extra "," made from previous loop 
    // this is for the new .c file. Since "\b" is technically a character 
    // to remove the extra "," requires overwriting it. 
    fseek(fw, -1, SEEK_CUR); 

    // "\b" moves cursor back one in the terminal 
    printf("\b};\n"); 
    fprintf(fw,"};\n"); 
    fclose(f); 
    fclose(fw); 
} 
Các vấn đề liên quan