Inicio › Herramientas para desarrolladores › Archivo a array en C

Archivo a array en C

Convierte cualquier archivo en un array de bytes en C o C++ que puedes compilar directamente en un firmware o una aplicación, igual que xxd -i. Elige hexadecimal o decimal, los bytes por línea y el tipo de elemento, y añade const, static, PROGMEM, alineación o una guarda de encabezado.

Última actualización:

El desplazamiento y la cantidad aceptan decimal o hexadecimal 0x.

Publicidad
Publicidad

Cómo usar Archivo a array en C

  1. Suelta un archivo (o cambia a la pestaña Texto y escribe una cadena).
  2. Revisa el nombre de la variable; se crea a partir del nombre del archivo, convirtiendo puntos, guiones y espacios en guiones bajos.
  3. Elige el formato: tipo de elemento, valores hexadecimales o decimales y bytes por línea.
  4. Añade calificadores como const, static o PROGMEM, y elige cómo se exporta la longitud.
  5. Copia el código o descarga el archivo .h e inclúyelo en tu proyecto.

Ejemplo de salida

Para un archivo de texto de 23 bytes llamado hello.txt, las opciones predeterminadas generan esto (desmarca const para obtener exactamente lo que imprime xxd -i):

/* hello.txt (23 bytes) */
const unsigned char hello_txt[] = {
  0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64,
  0x64, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x0a
};
const unsigned int hello_txt_len = 23;

Úsalo como cualquier otro array: fwrite(hello_txt, 1, hello_txt_len, f); o, para un array PROGMEM en AVR, pgm_read_byte(&hello_txt[i]).

Comparación de opciones

OpciónQué añadeCuándo usarla
constconst unsigned char name[]Casi siempre: los datos de solo lectura pueden quedarse en la flash o en una sección de solo lectura.
staticEnlace staticCuando el encabezado se incluye en varios archivos .c, para evitar errores de símbolos duplicados.
PROGMEMPROGMEM + #include <avr/pgmspace.h>Placas AVR (Uno, Nano, Mega), para mantener los datos fuera de la SRAM.
Alinear a 4 bytes__attribute__((aligned(4))) o alignas(4)Búferes DMA, o leer los bytes como palabras de 32 bits.
Guarda de encabezado#ifndef NAME_H … #endifCuando el archivo se guarda e incluye como encabezado .h.
Terminador 0x00Un byte cero adicionalAl incrustar texto que se usará como cadena de C.
C++ std::arrayconstexpr std::array<T, N>Código C++ moderno que quiere el tamaño en el tipo y acceso en tiempo de compilación.

Alternativas a un array de bytes

  • #embed de C23: los compiladores más recientes (GCC 15, Clang 19) admiten #embed "file.bin" dentro de un inicializador, que lee el archivo en tiempo de compilación.
  • Objetos del enlazador: ld -r -b binary file.bin -o file.o u objcopy convierten un archivo en un objeto con los símbolos _binary_file_bin_start y _end.
  • Los arrays de bytes (esta herramienta) siguen siendo la opción más portable: funcionan con cualquier compilador, IDE y cadena de herramientas de microcontroladores, y no requieren cambios en el sistema de compilación.

Preguntas frecuentes

¿La salida es igual que la de xxd -i?

Sí, salvo por un comentario de una línea con el nombre del archivo. Desmarca const y deja el resto de opciones predeterminadas (array de C, unsigned char, hexadecimal en minúsculas, 12 bytes por línea, longitud unsigned int) y el formato coincide con xxd -i: un array unsigned char con el nombre del archivo, sangría de dos espacios y una variable unsigned int name_len con el número de bytes.

¿Cómo se crea el nombre de la variable a partir del nombre del archivo?

Cada carácter que no es una letra, un dígito o un guion bajo se convierte en guion bajo, así que logo.png pasa a ser logo_png y font-16px.bin pasa a ser font_16px_bin. Un nombre que empezaría por un dígito recibe el prefijo data_, porque los identificadores de C no pueden empezar por un número. Puedes escribir cualquier otro nombre.

¿Qué hace PROGMEM?

En los microcontroladores AVR, como el Arduino Uno, los datos const se copian igualmente a la pequeña SRAM al arrancar. Añadir PROGMEM (de avr/pgmspace.h) mantiene el array en la memoria flash, y se lee con pgm_read_byte(). En ESP32, ARM y la mayoría de los demás chips, const ya basta para mantener los datos en la flash.

¿Debo usar unsigned char o char?

Usa unsigned char o uint8_t para datos binarios. El char simple tiene signo en la mayoría de los compiladores, así que los valores por encima de 0x7F no caben, lo que es un error de estrechamiento en la inicialización con llaves de C++ y una advertencia en C. Si eliges char o signed char, esos bytes se escriben con una conversión explícita.

¿Por qué añadir un terminador 0x00?

Añadir un byte cero te permite usar un archivo de texto incrustado (HTML, JSON, un shader o un certificado) directamente como cadena de C. El valor de longitud incluye entonces ese byte adicional.

¿Qué tamaño de archivo puedo convertir?

En el navegador se pueden convertir archivos de hasta 32 MB. La salida de texto ocupa aproximadamente seis veces el tamaño del archivo, así que las salidas muy grandes solo se previsualizan en parte en pantalla, pero al copiar y descargar siempre obtienes el encabezado completo.

¿Se sube mi archivo?

No. El archivo se lee con la File API del navegador y el encabezado se genera en tu dispositivo.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →