将每4位解释为十六进制值

时间:2012-12-01 19:01:35

标签: c++ binary hex bit-shift

我在将字节解释为字节时遇到了一些麻烦。我现在拥有的是8,16,24等位的字符串,我想将它们转换为十六进制字节。例如:

假设我有以下字符串:

10100101 00110000

我想将每个4解释为十六进制字节,所以我会

1010为A,0101为5,001为3,0000为0

然后当我把它们放在一起时,我应该

A5 30,根据各自的十六进制值对应¥0。不幸的是,我不完全确定如何做到这一点。可能有人有这个想法吗?如果是这样,那就太好了!谢谢!

2 个答案:

答案 0 :(得分:3)

这个问题是already solved for you,在C ++标准库的<bitset>标题中:

const unsigned long value1 = std::bitset<8>(std::string("10100101")).to_ulong();
const unsigned long value2 = std::bitset<8>(std::string("00110000")).to_ulong();

std::cout << std::hex << value1 << " " << std::hex << value2 << '\n';

答案 1 :(得分:1)

您应该将每个4位的组转换为一个字符,例如。用桌子:

 char Hex[16]={ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

计算此方法的通用方法(在任何2 BASES之间没有库)是:

步骤1)

  my_number = 0; // start to read digits.
  while((a = read_digit(BASE))>=0) { 
       // read_digit should return -1 for non digit
       my_number=my_number * BASE + a;
       // optionally: if (count++ == 4) break;  /* read only 4 bits or digits */
  }

步骤2)

  // convert my_number to another base (eg. hex or decimal or octal or Base64)
  // by repeated division by BASE and storing the modulus
  while (my_number) {
       int modulus = my_number % BASE;
       my_number/=BASE;
       PUSH(modulus);
  }

步骤2.5)

  // Pop the numbers in range (0..BASE-1) from stack 
  // to output them from left to right
  while (POP(my_number) >=0) {     // assumes that pop returns <0 when empty
      cout << myTable[my_number];  // this can be selected for any base
  }