Cockootec
Cockootec

Reputation: 546

Printing out byte array as formatted text gives different outputs - C

I am trying to print out byte array as one byte at the time in hexadecimal format within for loop like this:

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 in this case is structure from Kamailio - review at http://www.asipto.com/pub/kamailio-devel-guide/#c05str

The expected output:

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:

What I am getting:

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:

Could someone please help me understand why there are some of bytes prefixed with FFFFFF and other aren't?

Thanks in advance

Upvotes: 1

Views: 309

Answers (2)

Mr.C64
Mr.C64

Reputation: 42964

The problem appears with chars that have the most significant bit set (which are out of the proper pure ASCII set range 0-127). The key point is to consider chars as unsigned.

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

See this simple compilable repro C code:

#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;
}

With MSVC, I get this output:

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

Upvotes: 0

AndersK
AndersK

Reputation: 36082

Looks like obuf->s[i] returns a signed value

You would need to cast it to a unsigned value to get rid of the FFF.. at start.

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

Upvotes: 2

Related Questions