【问题标题】:Printing out byte array as formatted text gives different outputs - C将字节数组打印为格式化文本会给出不同的输出 - C
【发布时间】:2014-05-25 11:01:59
【问题描述】:

我试图在 for 循环中以十六进制格式将字节数组打印为一个字节,如下所示:

int my_function(void *data)
{
   obuf = (str*)data;

   int i;
   for (i = 0; i < obuf->len; i++)
   {
      printf("%02X:", obuf->s[i]);
   }

   return 0;
}

str 在这种情况下是来自 Kamailio 的结构 - 在 http://www.asipto.com/pub/kamailio-devel-guide/#c05str 进行审核

预期输出:

80:70:0F:80:00:00:96:00:1D:54:7D:7C:36:9D:1B:9A:20:BF:F9:68:E8:E8:E8:F8:68:98:E8:EE:E8:B4:7C:3C:34:74:74:64:74:69:2C:5A:3A:3A:3A:3A:3A:3A:32:24:43:AD:19:1D:1D:1D:1D:13:1D:1B:3B:60:AB:AB:AB:AB:AB:0A:BA:BA:BA:BA:B0:AB:AB:AB:AB:AB:0A:BA:BA:BA:BA:B9:3B:61:88:43:

我得到了什么:

FFFFFF80:70:0F:FFFFFF80:00:00:FFFFFF96:00:1D:54:7D:7C:36:FFFFFF9D:1B:FFFFFF9A:20:FFFFFFBF:FFFFFFF9:68:FFFFFFE8:FFFFFFE8:FFFFFFE8:FFFFFFF8:68:FFFFFF98:FFFFFFE8:FFFFFFEE:FFFFFFE8:FFFFFFB4:7C:3C:34:74:74:64:74:69:2C:5A:3A:3A:3A:3A:3A:3A:32:24:43:FFFFFFAD:19:1D:1D:1D:1D:13:1D:1B:3B:60:FFFFFFAB:FFFFFFAB:FFFFFFAB:FFFFFFAB:FFFFFFAB:0A:FFFFFFBA:FFFFFFBA:FFFFFFBA:FFFFFFBA:FFFFFFB0:FFFFFFAB:FFFFFFAB:FFFFFFAB:FFFFFFAB:FFFFFFAB:0A:FFFFFFBA:FFFFFFBA:FFFFFFBA:FFFFFFBA:FFFFFFB9:3B:61:FFFFFF88:43:

有人可以帮我理解为什么有些字节以FFFFFF 为前缀,而另一些则没有?

提前致谢

【问题讨论】:

    标签: c arrays hex byte


    【解决方案1】:

    问题出现在具有最高有效位集的chars(超出正确的纯 ASCII 集范围 0-127)。关键是将chars 视为unsigned

    printf("%02X:", (unsigned char)(obuf->s[i]));
    

    查看这个简单的可编译重现 C 代码:

    #include <stdio.h>
    #include <string.h>
    
    struct _str {
        char* s; /* pointer to the beginning of string (char array) */
        int len; /* string length */
    };
    
    typedef struct _str str;
    
    int my_function(void *data)
    {
       str* obuf;
       int i;
    
       obuf = (str*)data;
    
       for (i = 0; i < obuf->len; i++) {
          printf("%02X:", (unsigned char)(obuf->s[i]));
       }
    
       return 0;
    }
    
    int main(void)
    {
        char buf[2];
        str s;
    
        /* Test with ordinary ASCII string */
        s.s = "Hello";
        s.len = strlen(s.s);
        my_function(&s);
    
        printf("\n");
    
        /* Test with char values with most significant bit set */
        buf[0] = 0xF1;
        buf[1] = 0x00;
        s.s = buf;
        s.len = 1;
        my_function(&s);
    
        return 0;
    }
    

    使用 MSVC,我得到以下输出:

    48:65:6C:6C:6F:
    F1:
    

    【讨论】:

      【解决方案2】:

      看起来像 obuf->s[i] 返回一个有符号值

      您需要将其转换为无符号值以在开始时摆脱 FFF..。

      printf("%02X:", (unsigned char)(obuf->s[i]));
      

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2014-09-18
        • 2021-11-26
        • 2015-12-02
        相关资源
        最近更新 更多