Итак. Есть некое устройство, на которое надо передать пакет, пример:
0x00, 0xFF, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x0D, где 0xF5, 0x0D
Контрольные байты, считаются по CRC16
. Известно, что для этого пакета должна быть эта сумма. По какому именно алгоритму она считается не известно. Не могу написать программу, которая давала бы такой результат, в онлайн калькуляторах такой результат тоже не получается, в готовых программах для расчета CRC16
такой результат тоже не получается. Есть огрызок кода расчета. Немного доработал его. Но контрольная часть так и не получается именно такой.
byte[] Bytes6 = new byte[] { 0x00, 0xFF, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00};
[StructLayout(LayoutKind.Explicit)]
public struct crcStruct// Структура для СРС16
{
[FieldOffset(0)] public Byte bl;
[FieldOffset(1)] public Byte bh;
[FieldOffset(0)] public ushort all;
}
crcStruct crc16 = new crcStruct ();
private byte[] crc_Calc(byte[] pack, int length_pack)//расчет CRC пакета
{
byte[] res = new byte[2];
crc16.bh = 0xff;
crc16.bl = 0xff;
crc16.all = 0xffff;
ushort[] CRCArr = new ushort[] {
0x0,0x8005,0x800f,0xa,0x801b,0x1e,0x14,0x8011,0x8033,0x36,0x3c,
0x8039,0x28,0x802d,0x8027,0x22,0x8063,0x66,0x6c,0x8069,0x78,
0x807d,0x8077,0x72,0x50,0x8055,0x805f,0x5a,0x804b,0x4e,0x44,
0x8041,0x80c3,0xc6,0xcc,0x80c9,0xd8,0x80dd,0x80d7,0xd2,0xf0,
0x80f5,0x80ff,0xfa,0x80eb,0xee,0xe4,0x80e1,0xa0,0x80a5,0x80af,
0xaa,0x80bb,0xbe,0xb4,0x80b1,0x8093,0x96,0x9c,0x8099,0x88,0x808d,
0x8087,0x82,0x8183,0x186,0x18c,0x8189,0x198,0x819d,0x8197,0x192,
0x1b0,0x81b5,0x81bf,0x1ba,0x81ab,0x1ae,0x1a4,0x81a1,0x1e0,0x81e5,
0x81ef,0x1ea,0x81fb,0x1fe,0x1f4,0x81f1,0x81d3,0x1d6,0x1dc,0x81d9,
0x1c8,0x81cd,0x81c7,0x1c2,0x140,0x8145,0x814f,0x14a,0x815b,0x15e,
0x154,0x8151,0x8173,0x176,0x17c,0x8179,0x168,0x816d,0x8167,0x162,
0x8123,0x126,0x12c,0x8129,0x138,0x813d,0x8137,0x132,0x110,0x8115,
0x811f,0x11a,0x810b,0x10e,0x104,0x8101,0x8303,0x306,0x30c,0x8309,
0x318,0x831d,0x8317,0x312,0x330,0x8335,0x833f,0x33a,0x832b,0x32e,
0x324,0x8321,0x360,0x8365,0x836f,0x36a,0x837b,0x37e,0x374,0x8371,
0x8353,0x356,0x35c,0x8359,0x348,0x834d,0x8347,0x342,0x3c0,0x83c5,
0x83cf,0x3ca,0x83db,0x3de,0x3d4,0x83d1,0x83f3,0x3f6,0x3fc,0x83f9,
0x3e8,0x83ed,0x83e7,0x3e2,0x83a3,0x3a6,0x3ac,0x83a9,0x3b8,0x83bd,
0x83b7,0x3b2,0x390,0x8395,0x839f,0x39a,0x838b,0x38e,0x384,0x8381,
0x280,0x8285,0x828f,0x28a,0x829b,0x29e,0x294,0x8291,0x82b3,0x2b6,
0x2bc,0x82b9,0x2a8,0x82ad,0x82a7,0x2a2,0x82e3,0x2e6,0x2ec,0x82e9,
0x2f8,0x82fd,0x82f7,0x2f2,0x2d0,0x82d5,0x82df,0x2da,0x82cb,0x2ce,
0x2c4,0x82c1,0x8243,0x246,0x24c,0x8249,0x258,0x825d,0x8257,0x252,
0x270,0x8275,0x827f,0x27a,0x826b,0x26e,0x264,0x8261,0x220,0x8225,
0x822f,0x22a,0x823b,0x23e,0x234,0x8231,0x8213,0x216,0x21c,0x8219,
0x208,0x820d,0x8207,0x202}; //таблица CRC
byte shiftVAR;
for (int cnt = 0; cnt <= length_pack - 3; cnt++)
{
shiftVAR = crc16.bh;
crc16.bh = crc16.bl;
crc16.bl = pack[cnt];
if (cnt >= 2) crc16.all ^= CRCArr[shiftVAR];
}
shiftVAR = crc16.bh;
crc16.bh = crc16.bl;
crc16.bl = 0;
crc16.all ^= CRCArr[shiftVAR];
shiftVAR = crc16.bh;
crc16.bh = crc16.bl;
crc16.bl = 0;
crc16.all ^= CRCArr[shiftVAR];
res[0] = crc16.bh;
res[1] = crc16.bl;
return res;
Функцию вызываю, например, так:
textBox1.AppendText(Convert.ToString(crc_Calc(Bytes6, Bytes6.Length)[0], 16));
textBox1.AppendText(Convert.ToString(crc_Calc(Bytes6, Bytes6.Length)[1], 16));
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем привет! Совсем недавно у меня возникла задача задокументировать весь код в проекте, чтобы при использовании метода, интеллисенс студии...
Можно ли как-нибудь вызвать по таймеру асинхронную функцию в C#? У обычного SystemThreading
Читал, что есть Monodroid и Monotouch - фреймворки от XamarinИнформации маловато, оф