【问题标题】:Linux C program - HEX how can I Prefix with 0x [closed]Linux C程序 - 十六进制我如何用0x前缀[关闭]
【发布时间】:2020-02-09 08:53:12
【问题描述】:

此程序将字符串转换为十六进制。

#include <stdio.h>
#include <string.h>

int main(void) {
  char text[] = "thank you";
  int len = strlen(text);

  char hex[100], string[50];

  // Convert text to hex.
  int i,j;

  for ( i = 0, j = 0; i < len; i++, j+= 2) {
    sprintf(hex + j, "%02X", text[i] );
    printf("0x%X ", text[i] ); //this prints fine
    }
  printf("'%s' in hex is %s.\n", text, hex); //'thank you' in hex is 7468616e6b20796f75.

  // Convert the hex back to a string.
  len = strlen(hex);
  for (i = 0, j = 0; j < len; i++, j+= 2) {
    int val[1];
    sscanf(hex + j, "%2x", val);
    string[i] = val[0];
    string[i + 1] = '\0';
  }

  printf("%s as a string is '%s'.\n", hex, string);

  return 0;
}

但我需要0x74, 0x68, 0x61, 0x6E, 0x6B, 0x20, 0x79, 0x6F, 0x75 或赋值给数组

无符号字符键[] = {0x74, 0x68, 0x61, 0x6E, 0x6B, 0x20, 0x79, 0x6F, 0x75};

如何将此十六进制值存储到字符串中。

【问题讨论】:

  • 欢迎来到stackoverflow!你能澄清你的问题吗?这段代码有问题吗?

标签: c linux hex


【解决方案1】:

在您的sprintf() 格式中使用0x,并相应地增加您增加j 的数量。

for ( i = 0, j = 0; i < len; i++, j+= 5) {
    sprintf(hex + j, "0x%02X ", text[i] );
    printf("0x%X ", text[i] );
}

然后您需要在扫描时考虑到这一点。跳过前两个字符,然后递增5

也不需要将val 设为数组,您只需要一个int 变量即可。并且您可以在循环结束时添加空终止符,而不是每次都通过循环。

for (i = 0, j = 2; j < len; i++, j+= 5) {
    int val;
    sscanf(hex + j, "%2x", &val);
    string[i] = val;
}
string[i + 1] = '\0';

DEMO

【讨论】:

  • 它只打印一个十六进制的“谢谢”,十六进制是 0x74。我需要存储在数组 key[] = {0x74, 0x68, 0x61, 0x6E, 0x6B, 0x20, 0x79, 0x6F, 0x75};如何做到这一点
  • 它适用于我,请参阅演示链接。你确定你在0x%02X后面加了空格吗?
  • 您可以在循环前使用int key[len/5];,然后在循环中使用key[i] = val;
  • 您可以使用%4X 读取包含@​​987654334@(或0X)前缀的4 个字符的十六进制字符串。或者,实际上,您可以使用%4i 将最多 4 个字符读取为十六进制(如果它以 0x 开头)或八进制(如果它以 0 而不是 x 开头)或十进制。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2011-02-09
  • 1970-01-01
  • 2016-03-15
  • 2020-07-23
  • 2021-10-06
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多