Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

228
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!