Я довольно долго боролся с некоторыми низкоуровневыми сообщениями, и это оказалось проблемой с вычислением контрольной суммы. Я думал, что побитовый оператор XOR не заботится о знаке, поэтому я использовал QByteArray
для хранения байтов и использовал метод at
, который возвращает char
, для вычисления контрольной суммы. Сообщения правильно распознавались иногда, но не всегда.
Похоже, ребята на другом конце использовали uint8_t
для хранения байтов, и в некоторых ситуациях контрольная сумма не срабатывала. Я решил это, приведя char
к uint8_t
, но я серьезно озадачен этим.
Почему побитовый оператор XOR заботится о знаке? Я думал, что это работает на битовом уровне, независимо от того, что они представляют. Вот фрагмент кода, который я использовал, чтобы попытаться понять его.
#include <stdio.h>
#include <stdint.h>
#include <iostream>
#include <bitset>
int main ()
{
uint8_t a = 0b10010101;
char b = 0b10010101;
uint32_t checksum;
checksum = 55;
checksum ^= a;
std::cout << std::bitset<32>(checksum) << std::endl;
checksum = 55;
checksum ^= b;
std::cout << std::bitset<32>(checksum) << std::endl;
}
Даже если оба целых числа содержат одни и те же биты, операция дает разные результаты в каждом случае.
cstdio
в C++, а неstdio.h
- person KamilCuk   schedule 17.09.2018