Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

238
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda