【问题标题】:4 bytes datetime in hex convert to readable4 个字节的十六进制日期时间转换为可读
【发布时间】:2012-09-29 15:31:54
【问题描述】:

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

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

【问题讨论】:

    标签: c++ datetime hex


    【解决方案1】:

    要将编码后的数字转换为整数,您需要确定它是大端还是小端。

    由于您拥有的数据不是字符串,即数字不是文本而是直接二进制,因此您不能理智地使用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]);
    

    如果是 little-endian,则反转索引顺序(使 buffer[0] 变为 buffer[4] 等等)。

    【讨论】:

    • 对我来说不清楚,字符串是 "\xf4\xdd|\xad\x08" 还是相当于 char[5]={0xf4,0xdd,'|',0xad,0x08 };如果你解释正确,当然 sscanf 是错误的选择。
    【解决方案2】:

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

    int a,b,c,d;
    sscanf(input,"\\x%x\\x%x|\\x%x\\x%x",&a,&b,&c,&d);
    long result=a<<24 | b<<16 | c<<8 | d;
    

    这将为您提供 4108168456 作为您提供的价值。

    您对格式有哪些进一步的信息?

    int a,b,c,d;
    sscanf(input,"\\x%x\\x%x|\\x%x\\x%x",&a,&b,&c,&d);
    long field1=a<<8 | b;
    long field2=c<<8 | d;
    

    【讨论】:

    • 感谢您的回复。这是一个问题,我不知道这个表格是如何生成的。我知道我在上面描述过。
    • 您还有其他示例日期-值对吗?
    • 顺便问一下,你认为十六进制值中的竖线是什么意思?
    • 它可以是一切。我认为这只是光学标记,并为您提供了一种将其解析为 32 位值的方法。它可能会分隔两个“字段”。第二个“字段”可以指定自某个日期以来的天数,但要验证这一点,您需要检查更多的数据-值对。 (或:询问soap服务如何解释数据)
    • 我真的不相信在这里使用sscanf(),特别是格式化字符串对\x的使用没有意义。它甚至可以编译吗?
    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多