У меня есть контрольная сумма, которую я пытаюсь реконструировать, я уже знаю, как поддерживать генерацию контрольной суммы после того, как я знаю исходное начальное значение, которое использовалось для создания контрольной суммы в первую очередь.
Насколько я знаю, контрольная сумма генерируется с использованием математического уравнения двойного типа данных.
Окончательное значение для вычисленной контрольной суммы представляет собой целое число без знака, но перед этим оно преобразуется из числа double в значение unsigned long long, также известное как unsigned __int64.
Что я пытаюсь сделать, так это вернуть целое число без знака в то же значение в типе данных double, чтобы перейти к следующему шагу отмены контрольной суммы для получения исходного начального значения.
Пока вычисляется контрольная сумма, это значение, которое она генерирует в типе данных double. 3083570000.3115764
который создает контрольную сумму 0xB7CB8B50
Я не думаю, что это разговор с потерями, поэтому на самом деле ничего не потеряно, даже если он преобразует 8-байтовую двойную контрольную сумму обратно в 4-байтовую целочисленную контрольную сумму. Почему? потому что значение double
всегда создается путем умножения на 4294967295.0
, что, как я полагаю, предназначено только для устранения последних 4 байтов, вроде сдвига.
Таким образом, значение double
, которое я хочу получить, должно быть разделено на 4294967295.0
, чтобы точно вернуть исходное двойное значение до последней цифры.
Проблема в том, что я не могу разделить его правильно, потому что он не на 100% точен до последней десятичной точки. просто пытаюсь изменить это так же, как оно было создано в первую очередь.
Выходные данные Предположим, что исходная двойная контрольная сумма была 0.71794958809146792
0.71794958809146792 * 4294967295.0 = 3083570000.3115761849416764
ответ, отправленный в пакете, равен 0xb7cb8b50
если я вручную преобразую целое число без знака 0xb7cb8b50
в unsigned __int64
, оно должно выглядеть так 0x00000000b7cb8b50
Первоначальный дубликат того, как он был сгенерирован в коде, должен выглядеть так, я использовал тот же ключ до того, как он был добавлен к пакету, чтобы воссоздать те же условия, чтобы сделать контрольную сумму в первую очередь, и это должно выглядеть такReal ANSWER = 3083570000.3115764
So
0x00000000b7cb8b50 should equals = 3083570000.3115764 double
Мой обратный код выглядит так
unsigned int checksum = 0xb7cb8b50;
double test1 = (double)(unsigned __int64)checksum;
double test2 = double(checksum);
double test3 = static_cast<double>(checksum);
double test4 = *((double*)(void*)&checksum);
приведенный выше код неверен на несколько знаков после запятой.
test1 returns = 3083570000.0000000
test2 returns = 3083570000.0000000
test3 returns = 3083570000.0000000
test4 returns = 1.523486003547e-314#DEN
Как мне получить доп, .3115764
тоже мой вопрос.
double
кint
удаляет все после запятой. - person user253751   schedule 27.11.20154294967295.0
как-то связано с данными, которые в конечном итоге будут потеряны при преобразовании в беззнаковое целое, что-то вроде сжатия, поэтому любая потеря не будет иметь значения, я как бы отказался от этого реверсирования контрольной суммы, но , у меня была теория о том, что доли десятичных знаков могут быть сгенерированы с помощью статической процентной переменной, где каждая десятичная точка увеличивается на определенный процент для каждого целого числа до десятичной точки. - person SSpoke   schedule 29.11.2015