bin2c.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /**
  2. Converts input from stdin into an array of binary data for use in C.
  3. License: Public Domain
  4. Usage: app VariableName < input > output.c
  5. */
  6. #include <stdint.h> /* uintXX_t */
  7. #include <inttypes.h> /* PRIuXX macros */
  8. #include <stdio.h>
  9. static char const * appName = 0;
  10. static void usage()
  11. {
  12. printf("Usage: %s OBJECT_NAME < input > output.c\n\n", appName );
  13. }
  14. int main( int argc, char const ** argv )
  15. {
  16. appName = argv[0];
  17. if( (argc != 2) || (argv[1][0] == '-') )
  18. {
  19. usage();
  20. return 1;
  21. }
  22. char const * varname = argv[1];
  23. enum { bufSize = 1024 * 8 };
  24. unsigned char buf[bufSize];
  25. size_t rd = 0;
  26. size_t i = 0;
  27. size_t flip = 0;
  28. printf( "static unsigned char %s[] = {\n\t", varname);
  29. uint32_t size = 0;
  30. while( 0 != (rd = fread( buf, 1, bufSize, stdin ) ) )
  31. {
  32. size += rd;
  33. for(i = 0; i < rd; ++i )
  34. {
  35. printf( "0x%02x", buf[i] );
  36. if( !( (rd < bufSize) && (i == rd-1)) ) putchar(',');
  37. if( 16 == ++flip )
  38. {
  39. flip = 0;
  40. printf("\n\t");
  41. }
  42. else putchar(' ');
  43. }
  44. }
  45. printf("\n};\n");
  46. printf("#define %s_LEN %llu\n",varname,(unsigned long long)size);
  47. //printf( "enum { %s_length = %"PRIu32"%s }; ", varname, size,"UL");
  48. //printf("enum { %s_length = sizeof(%s) };\n", varname, varname );
  49. return 0;
  50. }