C++ 将十六进制转换为DIN代码

C++ 将十六进制转换为DIN代码,c++,C++,我想把一个十六进制代码转换成一个。计算结果如下图所示。 十六进制代码被转换成二进制代码。在此之后,它将按字节反转并转换为按DEC半字节。 我这里有问题。即使我本可以解决这个问题,但它仍然是低效的。也许你可以给我一些提示,看看哪些函数 步骤1:读入代码 您可以将所有字符读入std::string,这样您就有了一个包含“010C2E24DC”的字符串。然后可以使用std::strings接口将其拆分为多个std::strings,每个字符表示一个字节 步骤2:转换为字节 您可以使用std::stri

我想把一个十六进制代码转换成一个。计算结果如下图所示。 十六进制代码被转换成二进制代码。在此之后,它将按字节反转并转换为按DEC半字节。 我这里有问题。即使我本可以解决这个问题,但它仍然是低效的。也许你可以给我一些提示,看看哪些函数


步骤1:读入代码

您可以将所有字符读入
std::string
,这样您就有了一个包含
“010C2E24DC”
的字符串。然后可以使用
std::string
s接口将其拆分为多个
std::string
s,每个字符表示一个字节

步骤2:转换为字节

您可以使用
std::stringstream
将字符串转换为数字,就像您可以使用
std::cin
从控制台读取数字一样。每次使用
std::hex
运算符用单个“字节字符串”填充
std::stringstream

步骤3:位移位

使用二进制运算符的组合(例如shift()、and(&)或(|)来反转每个无符号字符中位的顺序

步骤4:分成半字节

同样,使用二进制运算符组合将位反转的无符号字符转换为半字节

步骤5:转换回字符串


您可以使用
std::stringstream
(或直接输出到
std::cout
),方法是将数字流化为数字,并将其转换为文本。您可能需要查看
std::setw
以添加零填充。

我会按照Peter的建议做一些事情

#include <cassert>
#include <cstring>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <string>
#include <bitset>

std::string hex2din(const char* hex) {
  assert(strlen(hex)==10);

  std::stringstream oss;
  std::stringstream ss;

  std::string hexstr = std::string(hex);

  int halfbyte;

  for (size_t j = 0 ; j < 5 ; j++) {
    std::string s = hexstr.substr(2*j,2);
    ss << std::hex << "0x" << s;
    unsigned short rev, tmp=0;
    ss >> rev;
    ss.clear();

    for(size_t i=0;i<8;i++)
    {
      tmp |= ( ((rev & (1<<i))?1:0) << (7-i));
    }
    rev = tmp;

    halfbyte = std::stoi(std::bitset< 4 >(rev >> 4).to_string(), nullptr, 2);
    oss << std::setfill('0') << std::setw(2) << halfbyte;

    halfbyte = std::stoi(std::bitset< 4 >(rev & 15).to_string(), nullptr, 2);
    oss << std::setfill('0') << std::setw(2) << halfbyte;
  }
  return oss.str();
}

int main(int argc, char* argv[]) {
  std::string s = hex2din("010C2E24DC");
  std::cout << s << std::endl;
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
字符串hex2din(常量字符*hex){
断言(strlen(十六进制)==10);
std::stringstream-oss;
std::stringstream-ss;
std::string hextr=std::string(hex);
int半字节;
对于(尺寸j=0;j<5;j++){
std::string s=hexstr.substr(2*j,2);

ss到目前为止你尝试了什么?你能告诉我们它有什么问题吗?我不能告诉你任何东西。因为它太糟糕了。我尝试读取字符数组,然后对它进行排序。但是我甚至遇到了cast错误和其他东西。我感到有点无助于解决这个问题。如果你给我们看代码,我们可以知道它有什么问题。没有它,很难找到它除了免费提供解决方案之外,你什么都可以做,这不是真正的解决方案。没有人会学到任何东西。将它分解为许多简单的函数:(1)将十六进制字符串转换为字节数组(2)位反转字节(3)将字节字符串转换为2个字符的十六进制Nybles。哇,非常感谢。我明天会看。很多东西,我将从中学习。谢谢你们和彼得!