【问题标题】:How to convert array of uint8_t values to hex dump char string in C如何将 uint8_t 值数组转换为 C 中的十六进制转储字符字符串
【发布时间】:2019-06-05 05:52:29
【问题描述】:

我想将字节数组uint8_t十六进制值转换为字符数组字符串(**相同的值不是ASCII),然后简单地打印这个字符串数组如下:

输入:

uint8_t myarr[4]={0x11,0x12,0x33,0x1A}

输出:

 1112331A

简单的 char 数组字符串不是十六进制数组字符串。

【问题讨论】:

  • 如果我正确理解您的问题,您所要求的通常称为“十六进制转储”。谷歌“hex dump c”或其他东西来获取示例。如果您对此有疑问,请尝试使用您自己的代码更多地扩展问题,因为很多事情取决于您的实际需求。
  • 获得所需输出的短代码:for(int i=0; i<4; ++i) printf("%02X", myarr[i]);。如果你真的想要一个字符串,它当然会变得有点复杂,因为 C 如何处理字符串,并且需要问题中缺少的那些额外细节。
  • 什么是“十六进制数组字符串”?字符串总是以 0 字节结尾的单个字符序列。

标签: c arrays string hex


【解决方案1】:

原始数据到 ASCII 十六进制转换的老派方法是使用基于半字节的查找表:

#include <stdint.h>
#include <stdio.h>

int main (void)
{
  uint8_t myarr[4]={0x11,0x12,0x33,0x1A};
  char hexstr[4][2+1] = {0};

  const char HEX [16] = "0123456789ABCDEF";
  for(size_t i=0; i<4; i++)
  {
    hexstr[i][0] =  HEX[ (myarr[i] & 0xF0) >> 4 ];
    hexstr[i][1] =  HEX[ (myarr[i] & 0x0F) ];
    puts(hexstr[i]);
  }
}

【讨论】:

    【解决方案2】:

    只需遍历数组的元素并使用printf 使用"%hhx" 格式说明符打印每个元素。

    另请注意,这些值不会以十六进制形式存储。十六进制只是表示值的一种形式。

    【讨论】:

    • 我只是想说%hhx。不错。
    • 既然这不是 scanf,那么 %hhx 是否有意义?该函数无论如何都会收到一个 int (它是一个可变参数函数),所以 %x 或 %02x 应该没问题。我错过了什么吗?
    • @CostantinoGrana 是的,签名 int 可能带有签名扩展
    • 正确的格式字符串实际上是来自 inttypes.h 的"%" PRIx8
    • @Someprogrammerdude 抱歉,我的评论丢失了unsigned。既然原来的基准是uint8_t,难道不应该提升为unsigned int吗?示例:ideone.com/1VlMGvgodbolt.org/z/qWIkCx
    猜你喜欢
    • 2020-11-15
    • 2021-11-05
    • 1970-01-01
    • 2017-06-17
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多