C++ 4字节十六进制datetime转换为可读

C++ 4字节十六进制datetime转换为可读,c++,datetime,hex,C++,Datetime,Hex,我有一个来自服务器的响应,它被压缩并转换为base64字符串。我解码了这个响应,发现它看起来像一个soap文档。大多数值都是十六进制格式。所以我有一个参数datetime,它存储值“\xf4\xdd |\xad\x08”。我知道它代表了1982年6月24日的日期 如何将十六进制值转换为日期格式?更喜欢c/c++语言。要将十六进制格式转换为数字,可以使用scanf() inta、b、c、d; sscanf(输入“\\x%x\\x%x |\\x%x\\x%x”、&a、&b、&c、&d); long

我有一个来自服务器的响应,它被压缩并转换为base64字符串。我解码了这个响应,发现它看起来像一个soap文档。大多数值都是十六进制格式。所以我有一个参数datetime,它存储值“\xf4\xdd |\xad\x08”。我知道它代表了1982年6月24日的日期


如何将十六进制值转换为日期格式?更喜欢c/c++语言。

要将十六进制格式转换为数字,可以使用scanf()

inta、b、c、d;
sscanf(输入“\\x%x\\x%x |\\x%x\\x%x”、&a、&b、&c、&d);

long result=a要将十六进制格式转换为数字,可以使用scanf()

inta、b、c、d;
sscanf(输入“\\x%x\\x%x |\\x%x\\x%x”、&a、&b、&c、&d);

long result=a要将编码的数字转换为整数,需要确定它是大端数还是小端数

由于您拥有的数据不是字符串,即数字不是文本,而是直接以二进制表示,因此您不能合理地使用
sscanf()
,这是一个字符串解析函数

相反,是这样的:

const char *buffer = "\xf4\xdd|\xad\x08";
unsigned int stamp = (((unsigned char) buffer[0]) << 24) |
                     (((unsigned char) buffer[1]) << 16) |
                     (((unsigned char) buffer[3]) << 8) |
                     ((unsigned char) buffer[4]);
const char*buffer=“\xf4\xdd | \xad\x08”;

unsigned int stamp=((unsigned char)buffer[0])要将编码的数字转换为整数,需要确定它是大端还是小端

由于您拥有的数据不是字符串,即数字不是文本,而是直接以二进制表示,因此您不能合理地使用
sscanf()
,这是一个字符串解析函数

相反,是这样的:

const char *buffer = "\xf4\xdd|\xad\x08";
unsigned int stamp = (((unsigned char) buffer[0]) << 24) |
                     (((unsigned char) buffer[1]) << 16) |
                     (((unsigned char) buffer[3]) << 8) |
                     ((unsigned char) buffer[4]);
const char*buffer=“\xf4\xdd | \xad\x08”;

无符号整数戳记=((无符号字符)缓冲区[0])谢谢你的回复。这是一个问题,我不知道这个表单是如何生成的。我所知道的我已经在上面描述过了。你还有其他的日期-值对样本吗?顺便问一下,你认为竖条在十六进制值中的含义是什么?它可以是一切。我认为它只是光学标记,并为你提供了一种将其解析为32位值。它可能将两个“字段”分开。第二个“字段”可以指定自某个日期起的天数,但要验证这一点,您需要检查更多的数据-值对。(或者:询问soap服务如何解释数据)我真的不相信使用
sscanf()
这里,特别是格式化字符串使用的
\x
没有意义。它甚至可以编译吗?谢谢你的回复。这是个问题,我不知道这个表单是如何生成的。我知道我上面描述了什么。你有其他的日期-值对示例吗?顺便问一下,你认为垂直b的含义是什么ar内部的十六进制值?它可以是一切。我认为它只是光学标记,并为您提供了一种将其解析为32位值的方法。它可能会分隔两个“字段”。第二个“字段”可以指定自某个日期起的天数,但要验证这一点,您需要使用更多的数据值对进行检查。(或者:询问soap服务如何解释数据)我真的不相信在这里使用
sscanf()
,尤其是格式化字符串使用
\x
没有意义。它甚至可以编译吗?对我来说,不清楚字符串是“\xf4\xdd | \xad\x08”还是与char[5]={0xf4,0xdd',|',0xad,0x08};如果你正确地输入它,那么sscanf当然是错误的选择。对我来说,不清楚字符串是“\xf4\xdd |\xad\x08”还是与char[5]={0xf4,0xdd,“|”,0xad,0x08}等价的字符串;如果你正确地输入它,那么sscanf当然是错误的选择。
const char *buffer = "\xf4\xdd|\xad\x08";
unsigned int stamp = (((unsigned char) buffer[0]) << 24) |
                     (((unsigned char) buffer[1]) << 16) |
                     (((unsigned char) buffer[3]) << 8) |
                     ((unsigned char) buffer[4]);