변수 유형에 따라 0xff가 다른 표현을 가질 수 있다는 것을 알고 있습니다. signed (chars/ints (?))는 -1, unsigned chars는 255와 같습니다.' xff'이 인식되지 않는 이유는 무엇입니까?
하지만 구현 독립적 인 유형의 uint8_t를 사용하고 있으며 0xff가 실제로 반복되는 구조 내부에 있는지 확인했습니다. 코드는 다음과 같습니다.
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;
}
구조를 살펴본 결과 packet.msg [5]는 실제로 0xff로 설정되었습니다. 그러나 while 루프는 0xff를 발견하지 못했던 것처럼 무한 루프로 진행됩니다.
0x7f와 같은 값이 작동합니다. 나는 0x80을 시도하지 않았지만 0xff가 그렇지 않으면 아마 작동하지 않을 것이라고 생각한다. 아마도 서명과 관련이 있을지 모르지만 문제가 어디에서 발생했는지는 알 수 없습니다.
감사합니다.
EDIT : 0x7f 또는 0xff를 사용하면 나에게 문제가되지 않습니다. 그러나 나는 0xff를 탐지하지 못하게하는 것이 무엇인지 알고 싶습니다.
'while (* (msg ++)! = (uint8_t) '\ xff') {' –
'main'은'void'가 아닌'int'를 반환합니다. –
그리고'-Wall -Wextra'를 활성화하면 문제의 라인에서 "signed and unsigned 비교"경고가 나타납니다. –