Раз у Вас целая компания этим занимается, то может быть вы в курсе, почему никто из отечественных лидеров индустрии не занимается стандартизацией ГОСТов в TLS? По крайней мере об этом в TLS WG нет ни слова за последние годы.
Дело даже не в противоугонных средствах, а в прошивках ЭБУ. Для многих моделей стоит угонщику только получить доступ к диагразъёму — прощай авто. Видимо, проблема в дырявости этих прошивок, которые выполняют так же и функцию иммобилайзера. Вот и городят потому всякие перепиновки диагразъема.
Знаковый тип там стопудово не нужен, на счёт деления на 256 — сомневаюсь. Девайсу передаётся размер буфера в одном байте, то есть максимум 255.
Вообще даже по ассемблеру видно, что код писан какой-то школотой ) Например, в функции передаётся буфер, в который надо прочитать данные с устройства. Вместо того, чтобы отдать этот же буфер функции, которая коммуницирует с девайсом, коммуницирующей функции отдается локальный буфер на стеке, а после вызова он копируется memcpy() в оригинальный. И драйвер похоже собран без оптимизации даже )
В кратце смотрите: 1/255 нельзя представить в фиксированной точке абсолютно точно. Придется обрезать по какому-то кол-ву разрядов. И останется некий хвост. Так вот этот хвост на самом деле тоже иногда играет роль, но он может сыграть исключительно в виде ±1 для некоторых значений делимого. Вот этот код, который вы процитировали и занимается этим.
Но для целей определения делителя, которая являлось целью данной статьи, это абсолютно не играет роли.
Допустим, в моем случае для любого размер буфера от 255 до 507, я бы всегда в результате данного кода получал 1, будь это деление на 255 или на 254. А мне нужно написать код, который в точности эмулирует поведение оригинала. Как же мне узнать, что в оригинале с помощью дебагера?
То что это не какая-нибудь хитрая более операция, а деление, я вам гарантирую. Сомнения могут быть только в том, что это 255 )
Цитрованный вами код — это и есть обработка напильником ) На самом деле она такая сложная потому что используется знаковое деление. Когда деление беззнаковое, то оно заменяется беззнаковым умножением, и там работа с результатом гораздо проще и понятнее (и быстрее). Необходимости использовать именно знаковое деление в данном коде абсолютно нет, оно произошло банально от того, что исходный код оперировал int'ами, а не unsigned. Кстати, если будете использовать целочисленное деление на константы (не степени двойки) в своем коде, то имейте ввиду, что беззнаковое будет работать быстрее. При этом упаси Вас Галилей, самому имплементировать такой трюк — это успешно делает любой современный компилятор.
Без приведенных вами операций (используя только сдвиг вправо на 7), получаемый результат может отличаться от реального на единицу. Это как бы аналог округления в арифметике с фиксированной запятой.
Вот здесь немножечко подробнее об этом. При этом прошу обратить внимание, что у автора похоже произошла ошибка и под делителем в некоторых местах надо понимать делимое.
Аудиторский отчет — тоже вполне себе годная отправная точка, если он подписан представителем аудиторской компании и на нём стоит печать, и организация состоит в соотв. СРО или Палатах.
Писать заяву в полицию и в следственный комитет, прилагать заверенные (думаю, что собственноручно сгодится) копии отчета и лицензий компании-аудитора, требовать возбуждать дело. Если есть реквизиты подставных контор, то можно ещё обратиться в УБЭП с просьбой произвести проверку по фактам легализации и обнала.
Вне зависимости от того в какой группе вы находитесь, защищать свои права законными методами и приструнять оборзевших — это дело правильное по всем канонам.
Явно не тот случай. Явно. Поверьте )
Про когорту компиляторов: MS VC, ЕМНИП, заменяет умножением.
А что тогда вот это?
Хотя весьма странно выглядит постобработка. Для беззнакового умножения в ней нет нужды.
Вообще даже по ассемблеру видно, что код писан какой-то школотой ) Например, в функции передаётся буфер, в который надо прочитать данные с устройства. Вместо того, чтобы отдать этот же буфер функции, которая коммуницирует с девайсом, коммуницирующей функции отдается локальный буфер на стеке, а после вызова он копируется memcpy() в оригинальный. И драйвер похоже собран без оптимизации даже )
Но для целей определения делителя, которая являлось целью данной статьи, это абсолютно не играет роли.
Цитрованный вами код — это и есть обработка напильником ) На самом деле она такая сложная потому что используется знаковое деление. Когда деление беззнаковое, то оно заменяется беззнаковым умножением, и там работа с результатом гораздо проще и понятнее (и быстрее). Необходимости использовать именно знаковое деление в данном коде абсолютно нет, оно произошло банально от того, что исходный код оперировал int'ами, а не unsigned. Кстати, если будете использовать целочисленное деление на константы (не степени двойки) в своем коде, то имейте ввиду, что беззнаковое будет работать быстрее. При этом упаси Вас Галилей, самому имплементировать такой трюк — это успешно делает любой современный компилятор.
Без приведенных вами операций (используя только сдвиг вправо на 7), получаемый результат может отличаться от реального на единицу. Это как бы аналог округления в арифметике с фиксированной запятой.
Вот здесь немножечко подробнее об этом. При этом прошу обратить внимание, что у автора похоже произошла ошибка и под делителем в некоторых местах надо понимать делимое.
Писать заяву в полицию и в следственный комитет, прилагать заверенные (думаю, что собственноручно сгодится) копии отчета и лицензий компании-аудитора, требовать возбуждать дело. Если есть реквизиты подставных контор, то можно ещё обратиться в УБЭП с просьбой произвести проверку по фактам легализации и обнала.
Вне зависимости от того в какой группе вы находитесь, защищать свои права законными методами и приструнять оборзевших — это дело правильное по всем канонам.