Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
Datos generales al escribir en un archivo binario

Quiero escribir una matriz que contenga enteros de 16 bits como binario sin formato en un archivo y lo he intentado con el siguiente ejemplo:

 # define __int8_t_defined __intN_t (8, __QI__); __intN_t (16, __HI__); __intN_t (32, __SI__); __intN_t (64, __DI__); int main(int argc, char *argv[]) { FILE * rawf; rawf = fopen("./rawPcm","wb"); int16_t buff[] = {0,0,0}; fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); fclose(rawf); }

Sin embargo, la salida contiene más que solo ceros.

 $ hexdump -v rawPcm 0000000 0000 0000 0000 85fd 0804 0001 0000 0000 0000010 0000 85fd 0804 0001 0000018

Escribe 0000 0000 0000 85fd 0804 0001 para cada fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); mientras que esperaría obtener solo 0000 0000 0000 .

¿Qué representan los datos adicionales 85fd 0804 0001 y cómo evito que ocurra?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Qué representan los datos adicionales 85fd 0804 0001

Posiblemente algunos datos basura aleatorios.

como evito que ocurra?

fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); debe escribirse como:

 fwrite(buff,sizeof(int16_t), sizeof(buff) / sizeof(buff[0]),rawf); /* ^ ^^^^^^^^^^^^^^^ */ /* size of each object Count of objects */ /* (2) (3) */ /* or */ fwrite(buff, sizeof buf[0], sizeof buff / sizeof buff[0], rawf);

sizeof buff / sizeof buff[0] obtiene la longitud de la matriz en número de objetos (o miembros), mientras que sizeof buff proporciona el tamaño de la matriz en bytes.

Por lo tanto, está leyendo más allá del buff y lo está escribiendo en el archivo e invocando un comportamiento indefinido . En su caso, está viendo que los datos basura aleatorios se escriben en el archivo de salida.

En su caso, el sizeof de cada elemento en buff es de 2 bytes y la matriz buff tiene 3 miembros, lo que hace que el tamaño total sea de 6 bytes. Cuando escribes fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); , 6 objetos de 2 bytes cada uno se escriben en el archivo, lo cual no es algo que desee hacer.

Ahora está escribiendo 6 datos de tipo (tamaño) int16_t comenzando desde buff[0] es decir, buff[0..5] a la salida. buff[0..2] son 0 s como se esperaba y buff[3..5] son basura.

over 4 years ago · Santiago Trujillo Denunciar

0

El tercer argumento de fwrite es el número de elementos de tamaño especificado por el segundo parámetro. No es el tamaño total en bytes, lo que está haciendo actualmente.

Así que estás sobrepasando tu búfer.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda