微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 uint8_t 到十六进制字符串数组?

如何解决从 uint8_t 到十六进制字符串数组?

我知道这是一个简单的问题,但我完全迷失了。 我输入了一个字符串:

def get_driver():
    sl = BuiltIn().get_library_instance("SeleniumLibrary")
    return sl.driver

我想要:

input: 220209

所以 myarr 的维度总是 8,如果我有一个较低的输入字符串,我必须用 0x00 来完成。有人可以给我任何想法吗? 很抱歉打扰您,任何帮助将不胜感激。

问候

解决方法

使用 strtol() 一次转换 2 个字符,明确使用基数 16 使其变得容易:

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

// Assume s has an even number of hexdigit chars (at most 16) followed by a nul
void convert(const char *s,uint8_t out[static 8]) {
  int i = 0;
  // Handle 2 chars at a time
  while (*s) {
    char byte[3] = { *s,*(s + 1),0 };
    out[i++] = strtol(byte,NULL,16);
    s += 2;
  }
  // Fill the rest of the array with nuls
  for (; i < 8; i += 1) {
    out[i] = 0;
  }
}

int main(void)
{
  const char *input = "220209";
  uint8_t myarr[8];

  convert(input,myarr);

  // Pretty-print the array using hex values
  fputs("uint8_t myarr[8] = { ",stdout);
  for (int i = 0; i < 8; i += 1) {
    printf("0x%02" PRIx8,myarr[i]);
    if (i < 7) {
      fputs(",",stdout);
    }
  }
  puts(" };");

  return 0;
}
,

另一种选择是使用 sscanf() 一次解析两个字符:

void convert(const char *s,uint8_t out[8]) 
{
    memset(out,8);
    while (sscanf(s,"%2"SCNx8,out++) == 1) {
        s += 2;
    }
}

第一行利用 64 位算法将 8 个字节设置为 0。然后我们从字符串 s 中扫描两个字符,从十六进制 ASCII 表示中读取一个 uint8_t 类型的整数。如果读取成功,我们将移至接下来的两个字符。

看起来像 How to implement “select all” check box in HTML? 提交,但很好,因为没有任何内容被复制。

另一个版本可能是:

void convert(const char *s,uint8_t out[8])
{
    static char tbl[] = {
        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,};
    
    memset(out,8);
    while (*s) {
        *out++ = tbl[s[0]] * 16 + tbl[s[1]];
        s += 2;
    }
}
,

希望对你有用

memset(myarr,8);
int szLen = strlen(szInput);
for(int i = 0; i < szLen / 2; i++) {
   uint8_t high = toupper(szInput[i*2]);
   uint8_t low = toupper(szInput[i*2 + 1]);

   if(high >= '0' && high <= '9')
       high = high - '0';
   if(low >= '0' && low <= '9')
       low = low - '0';
   if(high >= 'A' && high <= 'F')
       high = high - 'A' + 10;
   if(low >= 'A' && low <= 'F')
       low = low - 'A' + 10;
   myarr[i] = (high << 4) | low; // bit operation is faster than arithmetic
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。