【问题标题】:Interpreting every 4 bits as hex value将每 4 位解释为十六进制值
【发布时间】:2012-11-19 16:55:52
【问题描述】:

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

假设我有以下字符串:

10100101 00110000

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

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

那么当我把它们放在一起时,我应该得到

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

【问题讨论】:

    标签: c++ binary hex bit-shift


    【解决方案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 */
      }
    

    第二步)

      // 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
      }
    

    【讨论】:

      【解决方案2】:

      这个问题是 already solved for you,在 C++ 标准库的 &lt;bitset&gt; 标头中:

      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';
      

      【讨论】:

      • 我想以不需要标准库的方式来做,可以吗?
      • @user200081:当然可以,但仅限于更复杂的代码。我拒绝花时间在这样的要求上,除非你正在编写一个微型微控制器?
      • @user200081:是的,当然。您认为标准库是如何做到的?这不是魔术。但是为什么要忽略标准库呢?
      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2019-01-09
      • 2011-03-05
      • 2013-08-27
      相关资源
      最近更新 更多