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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 14:50   #1
Linore
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 95
По умолчанию CRC16 в С#

У меня есть код CRC16 написанный в С
Не знаю как перевести его в С#
Помогите пожалуйста
Код:
/*******************************************************************************/
// Прототипы структур
//------------------------------------------------------------------------------
//Объединение, предназначенное для хранения кода CRC16
typedef union
{
	unsigned char	byte[2];
	unsigned int	word;
}byte_word;

/*******************************************************************************/
//-------------------------------------------------------------------------------
void CRC16_alg(unsigned char *puchMsg,unsigned int usDataLen, byte_word *code)
{
/*--------------------------------------------------------------------------*/
	unsigned int i,polinom=0xA001;
/*--------------------------------------------------------------------------*/
	code->word=0xFFFF;
/*--------------------------------------------------------------------------*/
	while(usDataLen--)
	{	/* Для каждого байта массива	*/
		code->byte[0]^=(*puchMsg++);
		for(i=0;i<8;i++)
		{
   	   	   	if(code->word & 0x01)		/* Выделить мл.бит	*/
   	   	   	{
              	code->word >>= 1;
   	   	   		code->word^=polinom;
   	   	   	}
   	   	   	else
              	code->word >>= 1;
		}
	}

Последний раз редактировалось Carbon; 29.01.2010 в 18:49.
Linore вне форума Ответить с цитированием
Старый 29.01.2010, 17:29   #2
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

look here: CRC C#
akasex вне форума Ответить с цитированием
Старый 29.01.2010, 18:14   #3
Linore
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 95
По умолчанию

Я это видела но мне нужно перевести именно этот код
Linore вне форума Ответить с цитированием
Старый 29.01.2010, 19:09   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Как-то так:
Код:
class CRC
{
	public static ushort CRC16_alg( byte[] msg )
	{
		const ushort polinom = 0xa001;
		ushort code = 0xffff;

		for ( int i = 0, size = msg.Length; i < size; ++i )
		{
			code ^= ( ushort )( msg[ i ] << 8 );

			for ( uint j = 0; j < 8; ++j )
			{
				code >>= 1;
				if ( ( code & 0x01 ) != 0) code ^= polinom;
			}
		}

		return code;
	}
}

Последний раз редактировалось Carbon; 29.01.2010 в 19:13.
Carbon вне форума Ответить с цитированием
Старый 29.01.2010, 20:53   #5
Linore
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 95
По умолчанию

Спасибо.
Подскажи мне пожалуйста а как посмотреть как он считает эту контрольную сумму?
в С# Windows forms
Если у меня массив byte[] buff = new byte[] { 0x01, 0x06, 0x20, 0x32, 0xFF, 0xFF };
int x = 0;

do
{
rt = Convert.ToString(buff[x]);// функция преобразования из стринга в число
textBox3.Text = rt;
x++;
} while (x < 7);
Linore вне форума Ответить с цитированием
Старый 29.01.2010, 22:28   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Linore Посмотреть сообщение
Спасибо.
Подскажи мне пожалуйста а как посмотреть как он считает эту контрольную сумму?
в С# Windows forms
Какой-нибудь список. Закинуть в него байты. И текстовое поле для суммы.
Carbon вне форума Ответить с цитированием
Старый 29.01.2010, 22:30   #7
Linore
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 95
По умолчанию

Прости я не поняла про список?
Linore вне форума Ответить с цитированием
Старый 29.01.2010, 22:37   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Та хотя бы ListBox из Common Controls. Какой-нить кнопкой добавляешь туда элементы массива бит. А потом считываешь массивом элементы списка.
Carbon вне форума Ответить с цитированием
Старый 30.01.2010, 19:41   #9
Linore
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 95
По умолчанию

Массив я могу и так задать byte[] buff = new byte[] { 0x01, 0x06, 0x20, 0x32, 0xFF, 0xFF };
а как мне посмотреть правильно ли работает CRC16?
как мне вызвать ее?
напрямую я ее записать в текст бокс не могу
Linore вне форума Ответить с цитированием
Старый 30.01.2010, 20:00   #10
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Linore Посмотреть сообщение
а как мне посмотреть правильно ли работает CRC16?
как мне вызвать ее?
напрямую я ее записать в текст бокс не могу
Можно отладкой пошагово.
В текстбокс строку можно:
Код:
string code = CRC.CRC16_alg( new byte[]{ 0x04, 0x33 } ).ToString();
либо в 16-ричной:
Код:
string code = Convert.ToString( CRC.CRC16_alg( new byte[]{ 0x04, 0x33 } ), 16 );
Carbon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непростая CRC16 (нужна помощь) Georgios Общие вопросы Delphi 5 30.07.2009 15:02