Я повторяю набор 32-разрядных шестнадцатеричных строк («DEADBEEF», «12345678» и т. Д.), И я пытаюсь суммировать их вместе, чтобы сформировать 32-разрядную контрольную сумму. Предположим, что переменная $temp
загружена шестнадцатеричной строкой в примере ниже.Как я могу суммировать большие шестнадцатеричные значения в Perl?
my $temp;
my $checksum;
for (...)
{
#assume $temp is loaded with a new hex string here
my $tempNum = hex ($temp);
$checksum += $tempNum;
$checksum &= 0xFFFFFFFF;
print printf("checksum: %08X",$checksum);
}
Первые несколько значений "7800798C", "44444444" и "44444444". Выход:
Контрольная сумма: 7800798C
контрольная сумма: BC44BDD0
контрольная сумма: FFFFFFFF
Контрольная сумма: FFFFFFFF
и т.д ..
, как вы можете видеть, что первые два сложений являются правильно, а затем он кажется насыщенным. Я что-то пропустил в отношении ограничения размера переменных Perl?
EDIT: Это реальный выход из сценария (строка является шестнадцатеричной строкой, значение десятичного преобразования этой строки, и контрольная сумма в результате выходе):
string: 7800798C, value: 2013297036, checksum 7800798C string: 44444444, value: 1145324612, checksum BC44BDD0 string: 44444444, value: 1145324612, checksum FFFFFFFF string: 44444444, value: 1145324612, checksum FFFFFFFF string: 78007980, value: 2013297024, checksum FFFFFFFF string: 44444444, value: 1145324612, checksum FFFFFFFF
Странно, можете ли вы также напечатать $ tempNum в этом printf? – catwalk
Этот код не генерирует контрольную сумму. Даже в Perl. :) – bzlm
@bzlm: Я знаю об этом :) Это всего лишь часть операции контрольной суммы, остальная часть этого не кажется неправильной, поэтому я ее не включил. – dls