Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is '\xff' not being recognized?

Tags:

c

I know that 0xff can have different representations depending on what the variable type is. Like -1 for signed (chars/ints(?)) and 255 for unsigned chars.

But I am using the implementation-independent type of uint8_t and i've made sure that 0xff is infact inside the structure I am iterating across. Here is the code:

struct pkt {
    uint8_t msg[8];
};

void main(int argc, char **argv) {
    ...

    struct pkt packet;
    memset(&packet, 0, sizeof packet);
    strcpy(packet.msg, "hello");
    packet.msg[strlen("hello")] = '\xff';

    crypt(&packet, argv[1]);    

    ...
}

void crypt(struct pkt *packet, unsigned char *key) {
    int size = msglen(packet->msg);

    ...
}

int msglen(uint8_t *msg) {
    int i = 0;
    while(*(msg++) != '\xff') {
        i++;
    }
    return i;
}

I've looked into the structure, and packet.msg[5] is indeed set to 0xff. But the while loop goes into an infinite loop, like it never discovered 0xff.

Values such as 0x7f works. I haven't tried 0x80 but I suspect it probably won't work if 0xff doesn't. It probably has something to do with the signness, but I just cant't see where the problem is supposed to come from.

Thanks.

EDIT: For me, it doesn't matter if I use 0x7f or 0xff. But I would just like to know what is preventing me from detecting 0xff.


1 Answers

If you have an unsigned, you can't use character literals.

'\xff' is -1, not 255, because the a character literal is signed.

The while condition is always true. If you are unsigned you should be using numbers only: 0 to 255, or casting characters you know are <128 to unsigned.

like image 194
Myforwik Avatar answered Dec 14 '25 10:12

Myforwik