Sé que la siguiente función:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Sólo se lee el byte por byte, mi objetivo es ser capaz de leer 12 bits en un momento y, a continuación, tomar en una matriz. Cualquier ayuda o punteros sería muy apreciada!

Lo siento, un byte a la vez es el más pequeño detalle que puede hacer. Tendrás que recurrir a (estremecimiento) real de la programación a la división de 12 bits entidades.
Creo que quiere que esta respuesta: stackoverflow.com/questions/141525/…

OriginalEl autor Ryan | 2012-07-27

6 Comentarios

  1. 5

    Añadiendo al primer comentario, usted puede tratar de leer un byte a la vez (declarar una variable char y escribir) y, a continuación, utilice los operadores bit a bit >> y << a leer poco a poco. Leer más aquí: http://www.cprogramming.com/tutorial/bitwise_operators.html

    eso es lo que voy a hacer, voy a dejar que usted sabe cómo funciona! Gracias mucho!! Este es probablemente el camino a seguir!!

    OriginalEl autor Carlos Vergara

  2. 2

    Leer los dos primeros bytes de su a_file puntero de archivo y verificación de los bits en el menor o mayor de bytes dependiendo de la endianness de su plataforma (x86 es little-endian) — uso de bitshift operadores.

    Realmente no se puede poner los bits en una matriz, ya que no hay un tipo de datos de bits. En lugar de mantener a los 1’s y 0’s en una matriz, que es ineficiente, que parece más barato sólo para mantener las dos bytes en una matriz de dos elementos (por ejemplo, de tipo unsigned char *) y escribir funciones para asignar los dos bytes a uno de 4096 (2^12) los valores de interés.

    Como una complicación, en las lecturas posteriores, si desea fread a través del puntero cada 12 bits, que sería de sólo lectura uno byte, el uso de los bits de la lectura anterior para construir un nuevo valor de 12 bits. Si no hay sobras, tendría que leer dos bytes.

    Sus funciones de asignación, se tendría que abordar el segundo caso donde los bits fueron utilizados desde la lectura anterior, debido a que los dos bytes tendría asignación diferente. Para hacer esto de manera eficiente, un módulo en una lectura del contador podría ser usado para intercambiar entre las dos asignaciones.

    OriginalEl autor Alex Reynolds

  3. 2

    He aplicado un par de métodos para leer/escribir archivos de a poco. Aquí son. Si es viable o no para el caso de uso, usted tiene que decidir por sí mismo. Yo he tratado de hacer más legible el código optimizado que he podido, no siendo un experimentado programador de C (por ahora).

    Internamente, utiliza un «bitCursor» para almacenar información acerca de los bits que aún no encajar un total de bytes. Tiene que campos de datos: d almacena los datos y s almacena el tamaño o la cantidad de bits almacenado en el cursor.

    Tiene cuatro funciones:

    • newBitCursor(), que devuelve un bitCursor objeto con los valores predeterminados

      {0,0}. Un cursor es necesario en el comienzo de una secuencia de
      operaciones de lectura/escritura a partir de un archivo.
    • fwriteb(void *ptr, size_t sizeb, size_t rSizeb, FILE *fp, bitCursor
      *c), que escribe sizeb de más a la derecha los bits del valor almacenado en el ptr de la fp.
    • fcloseb(FILE *fp, bitCursor *c), que escribe un byte, si
      la anterior escribe no exactamente encapsular todos los datos necesarios para
      ser escrito, que es, probablemente, casi siempre es el caso…
    • freadb(void *ptr, size_t sizeb, size_t rSizeb, FILE *fp, bitCursor
      *c), que dice sizeb bits y bit a bit Os a *ptr. (es, por lo tanto, su responsabilidad init *ptr como 0)

    Más información se proporciona en los comentarios. Divertirse!

    Edición: Ha llegado a mi conocimiento el día de hoy que cuando hice que me supone Little Endian! 😛 ¡Uy! Siempre es agradable darse cuenta de cuánto de un noob todavía lo soy ;D.

    Edit: GNU Binario de Descriptores de Archivo.

    OriginalEl autor quirinpa

  4. 1

    Hace muchos años, escribí algunas rutinas de e/S en C para un codificador Huffman. Este debe ser capaz de leer y escribir en la granularidad de bits en lugar de bytes. He creado funciones análogas a leer(2) y de escritura(2) que se podría solicitar a (digamos) leer de 13 bits de una secuencia. Para codificar, por ejemplo, los bytes se alimenta en la programacion y un número variable de bits surgiría el otro lado. Yo tenía una estructura simple con un poco de puntero en el byte actual de ser leído o escrito. Cada vez que iba al final, se tiraba de la completó byte y restablecer el puntero a cero. Por desgracia, ese código se ha ido hace tiempo, pero podría ser una idea para separar un open-source codificador Huffman y ver cómo se resolvió el problema allí. Del mismo modo, la codificación en base64, que dura de 3 bytes de datos y los convierte en 4 (o viceversa).

    Cada biblioteca de compresión tiene algo como eso. El uno en ffmpeg/libavutil se ve algo reutilizables.

    OriginalEl autor David G

  5. 1

    leer 2 bytes y poco sabio operaciones de hacerlo para la próxima vez que lea 2º bytes a partir de aplicar el bit a bit de las operaciones de volver usted espera . . . .

    OriginalEl autor sunmoon

  6. 0

    Para su problema, usted puede ver este programa de demostración que leer 2byte pero real de la información es sólo de 12 bits.Así como este tipo de cosas se utilizan poco en él sabia de acceso.

    fwrite() es un de la biblioteca estándar de la función de que tome el tamaño argumento como byte y de tipo int.De modo que no es exactamente 12 bits de lectura.Si el archivo que se crea, a continuación, crear como el de abajo, así como de lectura como por debajo de ella a resolver su problema.

    Si ese archivo es el archivo especial que no está escrito por usted, a continuación, siga la norma establecida para ese archivo a leer creo que también escrito como este sólo.O puede proporcionar la axact donde me pueden ayudar.

    #include<stdio.h>
    #include<stdlib.h>
    struct node
     {
       int data:12;
    
     }NODE;
    int main()
    {
       FILE *fp;
       fp=fopen("t","w");
       NODE.data=1024;
       printf("%d\n",NODE.data);
       fwrite(&NODE,sizeof(NODE),1,fp);
       NODE.data=0;
       NODE.data=2048;
       printf("%d\n",(unsigned)NODE.data);
       fwrite(&NODE,sizeof(NODE),1,fp);
       fclose(fp);
       fp=fopen("t","r");
       fread(&NODE,sizeof(NODE),1,fp);
       printf("%d\n",NODE.data);
       fread(&NODE,sizeof(NODE),1,fp);
       printf("%d\n",NODE.data);
       fclose(fp);
    }

    OriginalEl autor rajesh6115

Dejar respuesta

Please enter your comment!
Please enter your name here