开发者

How to ANSI-C cast from unsigned int * to char *?

开发者 https://www.devze.com 2022-12-26 05:38 出处:网络
I want these two print functions to do the same thing: unsigned int Arraye[] = {0xffff,0xefef,65,66,67,68,69,0};

I want these two print functions to do the same thing:

    unsigned int Arraye[] = {0xffff,0xefef,65,66,67,68,69,0};
            char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0};
    printf("%s", (char*)(2+ Array开发者_JAVA百科e));
    printf("%s", (char*)(2+ Arrage));

where Array is an unsigned int. Normally, I would change the type but, the problem is that most of the array is numbers, although the particular section should be printed as ASCII. Currently, the unsigned array prints as "A" and the char array prints as the desired "ABCDE".


This is how the unsigned int version will be arranged in memory, assuming 32-bit big endian integers.

00 00 ff ff 00 00 ef ef 00 00 00 41 00 00 00 42
00 00 00 43 00 00 00 44 00 00 00 45 00 00 00 00

This is how the char version will be arranged in memory, assuming 8-bit characters. Note that 0xffff does not fit in a char.

ff ef 41 42 43 44 45 00

So you can see, casting is not enough. You'll need to actually convert the data.

If you know that your system uses 32-bit wchar_t, you can use the l length modifier for printf.

printf("%ls", 2 + Arraye);

This is NOT portable. The alternative is to copy the unsigned int array into a char array by hand, something like this:

void print_istr(unsigned int const *s)
{
    unsigned int const *p;
    char *s2, *p2;
    for (p = s; *p; p++);
    s2 = xmalloc(p - s + 1);
    for (p = s, p2 = s2; *p2 = *p; p2++, p++);
    fputs(s2, stdout);
    free(s2);
}


As Dietrich said, a simple cast will not do, but you don't need a complicated conversion either. Simply loop over your array.

uint_t Arraye[] = {0xffff,0xefef,65,66,67,68,69,0};
  char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0};

uint_t *p;
for(p = Arraye+2; p; p++)
  printf("%c", p);

printf("%s", (char*)(2+ Arrage));
0

精彩评论

暂无评论...
验证码 换一张
取 消