我如何使用C中的位数据

时间:2011-09-18 00:52:40

标签: c file encryption bit

在课堂上我的任务是编写一个C程序,解压缩文本文件并打印出它包含的字符。文件中的每个字符由2位(4个可能的字符)表示。

我最近被告知所有系统上的字节不一定是8位,而char不一定是1字节。这让我想知道当我加载1个字节时,我应该知道从文件中加载了多少位。当没有可以保证设定位数的数据类型时,我怎么能把加载的数据保存在内存中。

如何处理C中的位数据?

3 个答案:

答案 0 :(得分:2)

您可以使用C中的位字段。如果您真正关心宽度,这些索引显式允许您指定字段每个部分的位数。此页面提供了讨论:http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx

例如,在实现IEEE754浮动的上下文中查看ieee754.h的用法

答案 1 :(得分:2)

一个字节不一定是8位。这当然是真的。另一方面,char被定义为一个字节--C不区分这两个东西。

但是,您要编写的系统几乎肯定具有8位字节。不同大小的字节在真正的旧系统或某些嵌入式系统之外基本上是不存在的。

如果您必须编写代码以便为多个平台工作,并且其中一个或多个具有不同大小的字符,那么您可以专门编写代码来处理该平台 - 例如使用CHAR_BIT确定每个字节包含多少位。

鉴于这是一个类,假设8位字节,除非另有说明。重点不在于极端的平台独立性,重点是教你一些关于小提琴(或者可能是位字段,但这取决于你在课堂上所涉及的内容)。

答案 2 :(得分:1)

  

这让我想知道我到底应该知道多少   当我加载1个字节时,从文件加载了这些位。

你很难找到一个字节不是8位的平台。 (尽管如上所述,CHAR_BIT可用于验证)。 还要向教师说明可移植性要求,或说明您的假设。

通常使用移位和按位运算来提取比特,例如, (x & 3)是x的最右边的2位。 ((x>>2) & 3)是接下来的两位。为您要定位的平台选择正确的数据类型,或者如果编译器可以使用uint8_t,请选择正确的数据类型。

另见: Type to use to represent a byte in ANSI (C89/90) C?

我建议使用位字段。另见:

When is it worthwhile to use bit fields?