在c ++中存储字节模式

时间:2012-10-03 11:02:06

标签: c++ word bit memory-address

我目前正在开展一个项目,要求我存储32位模式并对其进行分析。我需要一种方法来存储模式,如“1001 1001 1100 1000”在一个变量中,例如它不会被重新解释为char。

4 个答案:

答案 0 :(得分:2)

在C ++ 03中,我会使用unsigned intunsigned long,但两者都没有指定为32位。 unsigned long被指定能够保存至少值[0,2 32 -1],因此理论上它可能大于32位。在C ++ 11中,我使用uint32_t;

例如0000 0000 0000 0000 1001 1001 1100 10000x99c8,其中0x是十六进制前缀。

uint32_t bitpattern = 0x998c

如果变量bitpattern包含所需的位模式,并且您希望将其作为十六进制数字流式传输到控制台,则可以使用:

std::cout << std::hex << bitpattern;

答案 1 :(得分:1)

如果要将32位模式转换为int,还可以使用STL容器<bitset>来完成这项工作:

std::bitset<32> bit(std::string("0001100111001000"));
long unsigned bit_number = bit.to_ulong();
std::string bit_string = bit.to_string();

答案 2 :(得分:0)

你确实意识到模式不是32位,对吗?

因为它不是,像

unsigned long pattern = 0x99c8;

应该非常安全,你很难找到unsigned long小于16位的平台。 Lke Armen说,如果你有uint32_t,请使用它。

答案 3 :(得分:0)

除了尝试使用整数类型和位掩码来创建自己的系统之外,您可能还需要考虑内置的很少使用的功能,即bit fields。这种类型的定义很像结构,但每个元素的数据类型是匿名的,大小由位数指定。有一些开销,但不会超过你自己试图实现它;实际上,你让编译器完成工作。

如果需要在整数类型(例如long)之间来回转换结构,你可以只使用(ab)使用reinterpret_cast:

struct bitSet {
  bitSet(long in1) { //ctor, eg bitSet tmpBit(input);
    *this = reinterpret_cast<bitSet>(in1);
  }
  long toLong() { //eg output=tmpBit.toLong;
    return reinterpret_cast<long>(*this);
  }

  unsigned U0 : 4;
  unsigned U1 : 4;
  unsigned U2 : 4;
  unsigned U3 : 4;
  unsigned U4 : 4;
  unsigned U5 : 4;
  unsigned U6 : 4;
  unsigned U7 : 4;
};

这样做的好处是虽然你不能保证整数类型的长度,如此长,这确保每个元素只有4位长。