Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
jkrnd
170 / 60 / 11
Регистрация: 22.12.2015
Сообщений: 2,066
1

Как убрать небезопасный код из функции подсчёта контрольной суммы?

05.12.2017, 16:51. Просмотров 814. Ответов 8
Метки нет (Все метки)

Есть функция, представленная производителем приборов для проверки правильности приёма-передачи команд по Com-порту:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Алгоритм CRC: CRC-16-CCITT, Образующий многочлен = 0x1021
int CRCode(unsigned char* msg, unsigned short len)
{
    unsigned short j, crc = 0;
    while(len-- > 0)
    {
        crc = crc ^ (unsigned short)*msg++ << 8;
        for(j=0; j<8; j++)
        {
            if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;
            else crc <<= 1;
        }
    }
    return crc;
}
unsigned char* msg я заменю на byte[] msg
unsigned short - на ushort
а от указателей как убежать?
Может быть это на C# невозможно?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2017, 16:51
Ответы с готовыми решениями:

Код по алгоритму. Расчет контрольной суммы
Помогите написать код по этому алгоритму. 1) Пользователь может выбрать ввод 8-ми или на...

Подсчет контрольной суммы файла по CRC32: разобрать код
Здравствуйте. Есть вот этот код, суть его в том, что вбивается название файла, подсчитывается...

Как допустить компилировать небезопасный код в Visual Studio 2015?
В cmd также интересно как

Как разрешить небезопасный код в visual studio 2017 for mac
Как разрешить небезопасный код в вижле на маке, там в сборке нет этих параметров?

Небезопасный код
Всем привет, интересует такой вопрос. Мне нужно создать public partial class MyForm : Form {...

8
OwenGlendower
Супер-модератор
Эксперт .NET
11293 / 9514 / 4020
Регистрация: 17.03.2014
Сообщений: 19,046
Записей в блоге: 1
Завершенные тесты: 2
05.12.2017, 17:38 2
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, замены unsigned char* msg на byte[] msg более чем достаточно. Далее обычный for по массиву. Возможно даже второй аргумент не нужен (но это только если массивы обрабатываются целиком) т.к. длина массива известна.
1
jkrnd
170 / 60 / 11
Регистрация: 22.12.2015
Сообщений: 2,066
05.12.2017, 21:15  [ТС] 3
OwenGlendower,
строка 7 : оператор ++ не может применятся к операнду типа byte[]
строка 10: неявное преобразование int в bool не возможно
а если б ещё этот код на VB.net переложить, то было бы просто замечательно!
0
Someone007
3534 / 2587 / 1134
Регистрация: 09.05.2015
Сообщений: 6,353
Завершенные тесты: 1
05.12.2017, 21:45 4
Цитата Сообщение от jkrnd Посмотреть сообщение
строка 7 : оператор ++ не может применятся к операнду типа byte[]
crc = crc ^ (ushort)msg[i++] << 8;
Соответсвенно нужно добавить переменную i или использовать цикл по массиву...
Цитата Сообщение от jkrnd Посмотреть сообщение
строка 10: неявное преобразование int в bool не возможно
if ((src & 0x8000) != 0)
1
05.12.2017, 21:45
jkrnd
170 / 60 / 11
Регистрация: 22.12.2015
Сообщений: 2,066
05.12.2017, 22:03  [ТС] 5
Someone007, не выходит .
теперь в строке 7:
C#
1
crc = crc ^ (ushort)*msg[i++] << 8;
к указателю должен быть применён опреатор * или ->
в строке 10:
C#
1
2
3
if ((crc & 0x8000) != 0) 
                crc = (crc << 1) ^ 0x1021;
            else crc <<= 1;
не удаётся неявно преобразовать int в ushort
0
Someone007
3534 / 2587 / 1134
Регистрация: 09.05.2015
Сообщений: 6,353
Завершенные тесты: 1
05.12.2017, 22:33 6
Звездочку уберите, и приведение типа добавьте для второй ошибки.
0
jkrnd
170 / 60 / 11
Регистрация: 22.12.2015
Сообщений: 2,066
05.12.2017, 23:34  [ТС] 7
Someone007, звёздочку убрал теперь на приведение типов ругается
C#
1
crc = crc ^ (ushort)(msg[i++]<< 8;
дальше тоже не знаю как поступить. Будет время - попробуйте пожалуйста непосредственно в студии набрать.
0
Someone007
3534 / 2587 / 1134
Регистрация: 09.05.2015
Сообщений: 6,353
Завершенные тесты: 1
06.12.2017, 01:32 8
Возможно как-то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        int CRCode(byte[] msg, ushort len)
        {
            ushort j, crc = 0;
            int i = 0;
            while (len-- > 0)
            {
                crc = (ushort)(crc ^ ((ushort)msg[i++] << 8));
                for (j = 0; j < 8; j++)
                {
                    if ((crc & 0x8000) != 0)
                        crc = (ushort)((crc << 1) ^ 0x1021);
                    else
                        crc <<= 1;
                }
            }
            return crc;
        }
1
jkrnd
170 / 60 / 11
Регистрация: 22.12.2015
Сообщений: 2,066
06.12.2017, 03:14  [ТС] 9
Someone007, огромное спасибо! Всё работает!
0
06.12.2017, 03:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2017, 03:14

Небезопасный код в C#
Всем здравствуйте. Собственно есть задание: Задан стековый массив А(N, N). Поменять местами...

Безопасный и небезопасный код.
Есть некий класс unsafe class MyClass { //... public void SetKey(byte...

небезопасный код (unsafe)
Столкнулся с проблемой: Visual Studio 2010 ругается на unsafe, а именно: &quot;ошибка CS0227:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.