将字节数组打印为格式化文本会产生不同的输出 - C.

时间:2014-04-11 10:30:00

标签: c arrays hex byte

我正在尝试以十六进制格式将字节数组打印为一个字节,如下所示:

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为前缀而其他字符不是吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

问题出现在char s中,其中设置了最高位(超出了正确的纯ASCII设置范围0-127)。关键点是将char视为 unsigned

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

请参阅这个简单的可编译repro 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: