2016-02-24 3 views
-2

Я работаю на уступках, и прошу меня, чтобы вычислить контрольную сумму отгонки значащих байт из них дополняет версию целого ...C - Зачистка младших байт

Это часть из схемы назначения меня путают:

«Значение поля CHECKSUM (MM) рассчитывается путем принятия младшего значащего байта значения дополнения 1 в сумме полей COUNT, ADDRESS и DATA записи"

Im немного неясно, что это значит, поскольку я на самом деле не работал с эс комплементы или LSB-х в С

То, что я до сих пор:

int checkSum(int count, int address, char* data) 
{ 
int i = 0; 
int dataTotal = 0; 

for(i = 0; i < strlen(data); i += 2) 
{ 
    dataTotal += (getIntFromHex(data[i]) * 16) + getIntFromHex(data[i + 1]); 
} 

int checksum = ~(count + address + dataTotal) & 1; 
printf("Checksum: %.2X\n", checksum); 

return checksum; 
} 

Я не ожидал, чтобы это работало, но я сделал некоторые исследования, и это то, что я придумал.

Мне нужно уточнить, что подразумевается под наименее значимым байтом.

P.S. Причина цикла for - просто получить общее количество данных. Не важно для этого, но код использует переменную, поэтому я решил, что просто скопирую все это, чтобы избежать путаницы.

+0

Вы забыли задать нам вопрос. Можете ли вы указать, что вы не понимаете или что вам нужно? Вы знаете, что такое дополнение? Знаете ли вы, что такое младший байт? Кроме того, я вижу вызов 'strlen' в вашем коде. Но я не совсем уверен, какие строки имеют отношение ко всему. Похоже, что ваш ввод не является строкой. –

+0

Обновлен мой вопрос. Я просто хочу знать, как я могу это сделать, –

+0

Спецификация не очень ясна. Для начала, типы int могут быть проблемой, поскольку сумма может переполнять maxInt.и таким образом вызывать UB. Операции, такие как вычисление контрольных сумм, CRC, обычно выполняются с неподписанными типами. –

ответ

1

Мне нужно уточнить, что имеется в виду наименее значимый байт.

Последний значащий байт означает число MOD 256, результат от нуля до 255.

unsigned leastSignificantByte(unsigned j) 
{ 
    return j & 0xff; 
} 
+0

Ну, я бы пошел с 0xFF –

+0

Я согласен, это, возможно, немного легче понять. –

Смежные вопросы