将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);
玩的开心 :-)