将9位值的流作为字节写入C中的文件

我有一个数组,其整数值从0-511(最多9位)。 我试图用fwrite写这个文件。

例如,使用数组:

 [257, 258, 259] Which is 100000001, 100000010, 100000011 I am trying to write 100000001100000010100000011 + extra padding of 0s to the file 

但由于fwrite限制一次写入1个字节,我不知道该怎么做。 我是按位操作的新手,而不是如何分离各个字节。

你需要一个缓冲区。

由于此时要写入8位,因此必须具有至少可以保存9 + 7位的数据类型。 uint16_t会这样做,但我建议使用至少与你的原生int一样大的大小。 确保使用无符号类型以避免转移问题。

 uint32_t bitBuffer = 0; // Our temporary bit storage uint32_t count = 0; // Number of bits in buffer 

我们假设我们有单个数据:

 uint32_t data9b = 257; // 1 0000 0001 

向缓冲区添加位很简单; 只需在缓冲区末尾移位,并与OR结合使用。

 bitBuffer |= (data9b << count); // At first iteration, shift does nothing count += 9; // Update counter 

添加9位后,我们可以将8位刷新到文件。

 while(count >= 8) { writeToFile(bitBuffer & 0xFF); // Mask out lowest bits with AND bitBuffer >>= 8; // Remove written bits count -= 8; // Fix counter } 

在每个循环之后,在缓冲区中剩下0-7位。 在所有数据结束时,如果以8位的非倍数结束,只需将bitBuffer剩余内容写入文件。

 if(count > 0) writeToFile(bitBuffer); 

好吧,使用位移,oring(也可以用* ,’+’, %/ )也是如此,但是移位更合适/可读,imo。

 // Your data, n is the number of 9-bits values uint16_t dat[] = { 257, 258, 259 }; int i,n = sizeof(dat)/sizeof(*dat); // out file FILE *fp = fopen("f8.bin","w"); uint16_t one = 0; int shift = 0; uint8_t b; // main loop for(i=0 ; i>(8-shift); // Move the remaining MSb to the right shift = (shift+9) % 8; // next shift fwrite(&b, 1, 1, fp); // write our b byte } // remainder, always have a remainder fwrite(&one, 1, 1, fp); fclose(fp); 

玩的开心 :-)