Если исходник не очень большой - чтобы уместился в строковой переменной, можно через внешнюю тулу сгенерить C код. Я когда-то писал такую. chardump.c:
| Код | #ifdef HAVE_TCHAR_H #include <tchar.h> #else typedef char _TCHAR; #define _tmain main #define _T #define _tfopen fopen #define _ftprintf fprintf #endif
#include <io.h> #include <fcntl.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h>
#define MAXLEN 80
static int convert_char(char buf[10], int c, int col) { char *p = buf; switch(c) { case '\n': c = 'n'; col = MAXLEN; break; /*case '\t': c = 't'; break;*/ case '\t': goto noescape;
case '\a': c = 'a'; break; case '\b': c = 'b'; break; case '\f': c = 'f'; break; case '\r': c = 'r'; break; case '\v': c = 'v'; break; case '\"': case '\\': break; default: if ((unsigned char)c < 32) { p += sprintf(p, "\\%03o", (unsigned char)c); goto checklen; } goto noescape; } *p++ = '\\'; noescape: *p++ = c; checklen: col += (int)(p - buf); if ( col >= MAXLEN) { strcpy(p, "\"\n\""); return 0; } *p = '\0'; return col; }
static void convert(FILE *fin, FILE *fout) { char buf[10]; int col, c; fputc('\"', fout); for(col = 0;;) { c = fgetc(fin); if (c == EOF) { if (feof(fin)) break; if (errno != EINTR) { perror("read error"); break; } continue; } col = convert_char(buf, c, col); fputs(buf, fout); } fputc('\"', fout); }
char outbuf[BUFSIZ];
int _tmain(int argc, _TCHAR* argv[]) { int i; setbuf( stdout, outbuf );
if (argc < 2) { if (-1 == setmode(0, O_BINARY)) { perror("failed to reopen stdin in binary mode"); return 1; } convert(stdin, stdout); } for (i = 1; i < argc; i++) { FILE *f = _tfopen(argv[i], _T("rb")); if (!f) { _ftprintf(stderr, _T("failed to open '%s': "), argv[i]); perror(NULL); return 1; } convert(f, stdout); fclose(f); } fflush(stdout); return 0; }
|
Подаешь ей в stdin бинарные данные, а на выходе C строка в кавычках |