【问题标题】:Formatting a C string格式化 C 字符串
【发布时间】:2015-04-24 09:38:16
【问题描述】:

我需要按以下格式发送消息:

"\x9F\x02\x06\x00\x00\x00\x07\x00\x00\x9F\x03\x06\x00\x00\x00\x00\x00\x00\x9A\x03\x15\x04\x24"(十六进制字节)

最后三个十六进制字节代表一个日期。

每次发送此消息时,我都需要从系统(支付终端)检索日期,系统给出的日期是字符串格式:

"150424"

问题是我需要将此日期格式化为十六进制字节,然后将结果与消息的其余部分连接起来!

谁能帮我解决这个问题?

【问题讨论】:

  • 你提前知道,bee你要发送的字符串要多长时间?另外,您可以查看 %x 格式字符串 (cplusplus.com/reference/cstdio/printf)
  • 那么你想要的日期是binary-coded decimal 代表?
  • 24 会是\x18 不是吗?而15 将是\x0F。你试过什么?
  • 是的,所有其他字节都是固定的,问题是日期每天都在变化,所以我需要对其进行格式化,然后将其与其余字节连接起来。我尝试将 sprintf 与 %x 一起使用,但它给了我十六进制格式的 Ascii 代码,我需要的是十六进制字节格式的相同字符串! @Attilio
  • @SaraSara 为什么你不能?请注意,我说的是sscanf,而不是scanf。它解析一个字符串,它不从stdin读取。

标签: c string hex


【解决方案1】:

编辑:好的,既然我理解了这个问题,这就是答案(我认为 ^^)。

他的问题是他以 char* 形式接收日期(例如“150424”)并且他想从这些字符中生成 => '\x15' '\x04' '\x24'

我会这样做:

int i = 0;
char myStr[23] = "\x9F\x02\x06\x00\x00\x00\x07\x00\x00\x9F\x03\x06\x00\x00\x00\x00\x00\x00\x9A\x03\x00\x00\x00";

// get today's date
char date[6] = "150424";
int converted = strtol(date, NULL, 16);

myStr[20] = (converted & 0xFF0000) >> 16;
myStr[21] = (converted & 0xFF00) >> 8;
myStr[22] = converted & 0xFF;

printf("[%x", myStr[i] & 0xff);
for (i=1 ; i<23 ; ++i) printf(", %x", myStr[i] & 0xff);
printf("]\n");
return 0;

输出

[9f, 2, 6, 0, 0, 0, 7, 0, 0, 9f, 3, 6, 0, 0, 0, 0, 0, 0, 9a, 3, 15, 4, 24]

仅供参考:

您说您不需要将 15 转换为 0x0F,但这听起来很奇怪,因为 0x15 与当时的 15 没有任何共同之处...

万一你想用小数代替:

char date[6] = "150424";
int converted = strtol(date, NULL, 10);

myStr[20] = (converted / 10000);
myStr[21] = (converted / 100) % 100;
myStr[22] = converted % 100;

那么输出变成:

[9f, 2, 6, 0, 0, 0, 7, 0, 0, 9f, 3, 6, 0, 0, 0, 0, 0, 0, 9a, 3, f, 4, 18]

希望有所帮助

【讨论】:

  • 问题是我怎样才能在收到新的日期后,格式为:myStr[20] = '\x15' @Sephizack
  • 啊,好吧,您的意思是您将它作为字符串接收,但您不知道如何将其转换为 '\x15' ?这是你真正的问题,刚刚理解。 2秒我会更新我的答案然后
  • 它是最新的顺便说一句,它解决了你的问题吗?还是我还是错了?
  • 这不是我需要的,但感谢您的回复@Sephizack
  • @Jongware 我读了你的链接,但我不明白你的意思,据我所知,二进制编码的小数只不过是通常的二进制数。即使我明白你可以创建一个二进制代码,将 15 base 10 表示为 0001 0101 base 2。但我不明白你为什么说 15 在 BCD 中是 0x15,你能解释一下吗?
猜你喜欢
  • 2021-05-09
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
相关资源
最近更新 更多