Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2014, 16:52   #11
alex15
 
Регистрация: 15.12.2014
Сообщений: 5
По умолчанию

Alex11223, спасибо, я пересмотрел уже много ссылок. Но т.к. только начал разбираться в c#, то не понял, как это можно применить для строки типа string, а не для файла?

типа этого:
Код:
Crc32 crc32 = new Crc32();
String hash = String.Empty;
string str = "строка";
foreach (byte b in crc32.ComputeHash(str)) hash += b.ToString().ToLower();
Console.WriteLine("CRC-32 is {0}", hash);
alex15 вне форума Ответить с цитированием
Старый 15.12.2014, 17:13   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну для начала надо как-нибудь перевести строку в байты.

Например, так:
Код:
byte[] bytes = Encoding.UTF8.GetBytes(str);
Дальше (если код тот, что по моей ссылке) по-моему надо просто вызвать статический метод Compute

Код:
UInt32 hash = Crc32.Compute(bytes);
Но я не пользовался.

А для чего вам crc32 вообще? Цель какая?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.12.2014, 17:30   #13
alex15
 
Регистрация: 15.12.2014
Сообщений: 5
По умолчанию

Вот так работает, но результаты отличаются от php-шной функции:
Код:
string str = "строка";
byte[] bytes = Encoding.UTF8.GetBytes(str);
UInt32 hash = Crc32.Compute(bytes);
Console.WriteLine("CRC-32 is {0}", hash);
У меня программа взаимодействует с БД mysql и изначально я выбрал crc32 для поиска записей в таблице по полю с суммами. Но теперь мне кажется, что нужно отказаться от этой идеи и искать записи другим способом.
alex15 вне форума Ответить с цитированием
Старый 15.12.2014, 17:34   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от alex15 Посмотреть сообщение
Вот так работает, но результаты отличаются от php-шной функции:
Код:
string str = "строка";
byte[] bytes = Encoding.UTF8.GetBytes(str);
UInt32 hash = Crc32.Compute(bytes);
Console.WriteLine("CRC-32 is {0}", hash);
У меня программа взаимодействует с БД mysql и изначально я выбрал crc32 для поиска записей в таблице по полю с суммами. Но теперь мне кажется, что нужно отказаться от этой идеи и искать записи другим способом.
там кодировка скорее всего разная, почитайте как работает функция у php или по подбирайте разные.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.02.2015, 19:36   #15
Юрий48
Новичок
Джуниор
 
Регистрация: 21.02.2015
Сообщений: 1
По умолчанию

По вполне разумным соображением возникла идея создать универсальную программу по расчёту CRC кода для разных полиномов и их порядков. Казалось бы, что тут сложного, математическое описание есть, вполне понятное и достаточно простое. Но реально на это накладывается как аппаратные возможности, так и программные. Так алгоритм, созданный в соответствии с мат описанием практически не даёт того же результата как у других алгоритмов, хотя сам по себе работает правильно и результат имеет правильный и свойства, адекватные свойствам CRC суммы. Одним из наборов исходных параметров, которые могут обобщить алгоритм, является набор, представленный в http://vikipediya.uz.cm/wiki/CRC , например:
Name : CRC 16
Width : 16
Poly : 8005
Init : 0000
RefIn : True
RefOut : True
XorOut : 0000
Check : BB3D

Но описание некоторых из них достаточно неоднозначно (моя фантазия представляет достаточно много вариантов, чтобы их всех перепробовать). Перелопатил много информации, но не смог найти более чёткого описания. А с помощью тех алгоритмов, которые достаточно широко представлены в интернете, мне не удаётся создать общую картину этой проблемы. В чём и прошу помощи.
Как минимум хотелось бы более чётко понять, как влияют параметры Init. RefIn, RefOut, XorOut на сам алгоритм, свойства CRC суммы. Возможно любое их сочетание или какие то жёсткие наборы.
А как максимум сам обобщённый алгоритм. Может, для этого необходимо ещё вводить параметры. Вот написал и подумал, что эти вопросы под силу для достаточно "крутому" специалисту. Но, может, общими усилиями осилим эту задачу.

Последний раз редактировалось Юрий48; 21.02.2015 в 19:40.
Юрий48 вне форума Ответить с цитированием
Старый 18.03.2015, 23:16   #16
termoking
Новичок
Джуниор
 
Регистрация: 18.03.2015
Сообщений: 2
По умолчанию

Доброго времени суток формучане. может кому поможет данное сообщение. и есть вопрос к знатокам. я сам в Си не силен, да и не профи!
Вот описание алгоритма для вычисления CRC Modbus

Алгоритм генерации CRC:
1. 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC.
2. Первый байт сообщения складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра CRC. Результат помещается в регистр CRC.
3. Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0.
4. (Если младший бит 0): Повторяется шаг 3 (сдвиг)
(Если младший бит 1): Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex.
5. Шаги 3 и 4 повторяются восемь раз.
6. Повторяются шаги со 2 по 5 для следующего сообщения. Это повторяется до тех пор пока все байты сообщения не будут обработаны.
7. Финальное содержание регистра CRC и есть контрольная сумма.
ПРИМЕР
Пример функции на языке C реализующей генерацию CRC приведен ниже. Все возможные величины CRC загружены в два массива. Один массив содержит все 256 возможных комбинаций CRC для старшего байта поля CRC, другой массив содержит данные для младшего байта. Идексация CRC в этом случая обеспечивает быстрое выполнение вычислений новой величины CRC для каждого нового байта из буфера сообщения.
Функция принимает два аргумента:
unsigned char *puchMsg; /* Указатель на буфер */
unsigned short usDataLen; /* Количество байтов в буфере */
Функция возвращает CRC как тип unsigned short.
static unsigned char auchCRCHi[] = { 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0,0x80, 0x41,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,0x80, 0x22,0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1, 0x81,0x40,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x00,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x01,0xC0,0x80,0x41,0x00,0xC1, 0x81,0x40
}
static char auchCRCLo[] = { 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02, 0xC2,0xC6,0x06,0x07,0xC7,0x05, 0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD, 0x0F,0xCF,0xCE,0x0E,0x0A,0xCA, 0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8, 0x18,0x19,0xD9,0x1B,0xDB,0xDA, 0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D, 0x1C,0xDC,0x14,0xD4,0xD5,0x15, 0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13, 0xD3,0x11,0xD1,0xD0,0x10,0xF0, 0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32, 0x36,0xF6,0xF7,0x37,0xF5,0x35, 0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF, 0x3F,0x3E,0xFE,0xFA,0x3A,0x3B, 0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8, 0xE9,0x29,0xEB,0x2B,0x2A,0xEA, 0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC, 0x2C,0xE4,0x24,0x25,0xE5,0x27, 0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23, 0xE1,0x21,0x20,0xE0,0xA0,0x60, 0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66, 0xA6,0xA7,0x67,0xA5,0x65,0x64, 0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F, 0x6E,0xAE,0xAA,0x6A,0x6B,0xAB, 0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9, 0x79,0xBB,0x7B,0x7A,0xBA,0xBE, 0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C, 0xB4,0x74,0x75,0xB5,0x77,0xB7, 0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1, 0x71,0x70,0xB0,0x50,0x90,0x91, 0x51,0x93,0x53,0x52,0x92,0x96,0x56, 0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E, 0x5E,0x5A,0x9A,0x9B,0x5B,0x99, 0x59,0x58,0x98,0x88,0x48,0x49,0x89, 0x4B,0x8B,0x8A,0x4A,0x4E,0x8E, 0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44, 0x84,0x85,0x45,0x87,0x47,0x46, 0x86,0x82,0x42,0x43,0x83,0x41,0x81, 0x80,0x40
}
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg;
unsigned short usDataLen;
{
unsigned char uchCRCHi = 0xFF;
unsigned char uchCRCLo = 0xFF;
while (usDataLen--)
{
uIndex = uchCRCHi
*puchMsg++;
uchCRCHi = uchCRCLo
auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
---------------------------------------------------------------------------------------
termoking вне форума Ответить с цитированием
Старый 18.03.2015, 23:16   #17
termoking
Новичок
Джуниор
 
Регистрация: 18.03.2015
Сообщений: 2
По умолчанию

А вот пример из другого документа :
CRC Detect
Use RTU mode, the message including the method based on the CRC error detection fields. CRC field test the entire contents of the message.
The CRC field is two bytes that contains a 16 bit binary value. Calculated by the transmission equipment was added to the message. Receives the message receiving device recalculates the CRC, and with the received CRC value in the field, and if the two values are different, then an error.
CRC added to messages, the low byte of the first to join, and then the high byte. CRC simple function as follows:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* the message to be CRC checksum */
unsigned short usDataLen ; /* The number of bytes in the message */
{
unsigned char uchCRCHi = 0xFF ; /* High CRC byte initialization */
unsigned char uchCRCLo = 0xFF ; /* Low CRC byte initialization */
unsigned uIndex ; /* CRC cycle index */
while (usDataLen--) /* Transmitted message buffer */
{
uIndex = uchCRCHi ^ *puchMsgg++ ; /* Calculate the CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
--------------------------------------------------------------------------------------
вопрос по второму примеру : может ли ктонибудь описать алгоритм (второго примера) в таком виде как он описан в первом примере т.е словесно?
termoking вне форума Ответить с цитированием
Старый 18.03.2015, 23:21   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

C# это не С.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление значения функции и переменных, вычисление площади треугольника, определение расстояния между точками на турбо паскале _4Alex4_ Помощь студентам 2 14.12.2011 01:43
CRC файла. maxflint Win Api 2 04.05.2011 12:09
подсчет CRC Женя_88 Общие вопросы C/C++ 2 16.11.2010 15:01
Подсчет CRC newcooller Помощь студентам 0 08.11.2010 15:58
CRC ОШИБКА mikki1130 Софт 0 26.11.2009 18:42