Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 十六进制字符数组2乘2个字符到uint8\u t_C++_C_Mbed - Fatal编程技术网

C++ 十六进制字符数组2乘2个字符到uint8\u t

C++ 十六进制字符数组2乘2个字符到uint8\u t,c++,c,mbed,C++,C,Mbed,我正在为一个微控制器(mbed LPC1768)编写一个程序,在解码uint8的串行输入时遇到了一些问题 我得到一个charackbuffer[20]由来自外部设备的输入填充。 我们得到的是例如:f04a34b6785121\r 我想做的是得到一个uint8_t数组,其中每个数字由两个字符的十六进制值表示。F表示来自外部设备的消息已启动,回车为每条消息的结尾 因此,我希望uint8_t数组中的内容是: 0x04 0x0A 0x34 ... 更困难的是,ackBuffer的大小可能更小,因此,例

我正在为一个微控制器(mbed LPC1768)编写一个程序,在解码uint8的串行输入时遇到了一些问题

我得到一个
charackbuffer[20]由来自外部设备的输入填充。
我们得到的是例如:
f04a34b6785121\r

我想做的是得到一个uint8_t数组,其中每个数字由两个字符的十六进制值表示。F表示来自外部设备的消息已启动,回车为每条消息的结尾

因此,我希望uint8_t数组中的内容是:

0x04
0x0A
0x34
...
更困难的是,ackBuffer的大小可能更小,因此,例如,仅
F04004A\r
(如果这很容易修复,那么这很好,但我可以自己解决这个问题


谢谢!

所以我假设
ackMessage
必须以
'F'
开头,以
'\r'
结尾。我甚至假设,由于您在微控制器上工作,因此应该避免任何超出要求的操作(例如库函数)。考虑到您只需在缓冲区上迭代:

uint8_t charToHex(unsigned char value)
{
  if (value >= '0' && value <= '9') return value - '0';
  else if (value >= 'A' && value <= 'F') return value - 'A' + 10;
  else if (value >= 'a' && value <= 'f') return value - 'a' + 10;
  assert(false);
}

#define BUFFER_SIZE (20)

int main(void)
{
  char ackBuffer[BUFFER_SIZE] = "F12345890AB\r";
  uint8_t result[(BUFFER_SIZE-2)/2]; // at most 9 bytes since it's 20 - 2 / 2

  char* ptr = ackBuffer;

  assert(*ptr == 'F');
  ++ptr;

  int count = 0;
  while(*ptr != '\r')
  {
    uint8_t value = charToHex(*ptr) << 4 | charToHex(*(ptr+1));
    result[count++] = value;
    ptr += 2;
  }

  int i;
  for (i = 0; i < count; ++i)
    printf("%x\n", result[i]);

  return 0;
}
uint8\t charToHex(无符号字符值)
{

如果(value>='0'&&value='A'&&value='A'&&value='A'&&value>如何将字符串
“04”
转换为整数
0x04
?@OliCharlesworth一种老方法是
scanf(%2.2x),&val)
.ackBuffer[0]='0';ackBuffer[16]=0;/*null terminate*/然后遵循@MadScienceDreams:在运行时成本低于开发时间的PC上就是这样做的。而不是在处理能力严重受限的微控制器上。@Zac:
sscanf
绝对不是一个好的性能目标。
strtol
将是库提供的最好的函数,但是它仍然比必要的更一般。@OliCharlesworth:我很无聊:(感谢mate的快速回答!我会尝试这么做。@BenVoigt:是的,这是一个拼写错误(代码中确实正确)。谢谢,刚刚修复了它。是的,它以'\r'结尾(回车,ASCII格式为13)而不是r。以前用过sscanf,但没有真正起作用。也尝试过一些困难的事情,但也没有达到我想要的效果。