У меня есть этот кусок кода здесьExtra 0xFFFFFF во время шифрования исключающего
#include<stdio.h>
#define LEN 10
char buf[] = {0xff,0xaa,0xfc,0xe8,0x89,0x00,0x00,0x00,0x60,0x89};
char key[] = "SAMPLE KEY";
int main()
{
int i;
char enc[LEN];
for(i=0;i<LEN;i++)
{
enc[i] = (key[i % LEN]^buf[i]);
printf("0x%x,",enc[i]);
}
}
который выводит
ВЫВОД
0xffffffac,0xffffffeb,0xffffffb1,0xffffffb8,0xffffffc5,0x45,0x20,0x4b,0x25,0xffffffd0
где ожидается выход
0xac,0xeb,0xb1,0xb8,0xc5,0x45,0x20,0x4b,0x25,0xd0,
Как я могу это исправить? Почему это происходит?
Это работает, потому что что-либо с битом знака (бит 7) будет расширяться путем неявного преобразования с выходными функциями. – Joe
+1 Спасибо, Это сработало как шарм, но не могли бы вы объяснить, почему у нас есть эта проблема ... – vikkyhacks
@vikkyhacks: Вы переполнили значение, которое может удерживать символ 'char'.В вашей реализации «char» подписан, и это почти наверняка дополнение восьми бит. Это означает, что он может содержать только значения от -128 до 127. Исходный текст '0xff' означает номер 255, который больше, чем ваш' char' может удерживать. Поэтому он переполнился. В вашей реализации C он сохранил бит 11111111 в символе. Эти биты представляют значение -1. Когда подписанный 'char' со значением -1 передается' printf', ему присваивается 'int'. Результатом является «int» со значением -1, которое представлено битами 0xffffffff. –