Мне нужно вычислить контрольную сумму CRC для CAN BUS.Вычислить CRC 15 для CAN BUS
Сценарий:
Мой вход выглядит всегда как следующие (где x
либо 1
или 0
, *
Marks несколько раз x
, |
отмечает раздел и -
является изменение способа ввода, lb
является Label
, tb
является TextBox
, cb
является ComboBox
):
lb
: 0tb
: 11xcb
: хcb
: хlb
: 1tb
: 4x =>Convert.ToString(8-64/8, 2).PadLeft(4, '0');
tb
: 8-64x, =>8-64 % 8 == 0
tb
: 15x =>CRC of above
lb
: 1lb
: 11lb
: 1111111lb
: 111
который возвращает этот макет:
0|11*x-x|x-1-4*x|64*x|15*x-1|11|1111111|111
Пример:
00101010101000100100101010100101010(missing 15*x CRC sum)1111111111111
Эта строка будет обработана следующим расширением строки, так что максимальные 5 равные цифры следуют друг за другом:
public static string Correct4CRC(this string s)
{
return s.Replace("00000", "000001").Replace("11111", "111110");
}
После этого следующий метод возвращает делитель:
public static BigInteger CreateDivisor(string s)
{
var i = BigInteger.Parse(s);
var d = BigInteger.Pow(i, 15) + BigInteger.Pow(i, 14) + BigInteger.Pow(i, 10) + BigInteger.Pow(i, 8) + BigInteger.Pow(i, 7) + BigInteger.Pow(i, 4) + BigInteger.Pow(i, 3) + 1;
return d;
}
Единственная проблема, я «ве получил это часть с ^
:
public static string CRC(this string s)
{
var dd = s.Correct4CRC();
var dr = dd.CreateDivisor().ToString();
int drl = dr.Length;
var d = dd.Substring(0, drl).CreateDivisor();
var f = d^dr.CreateDivisor();
var p = true;
while (p)
{
d = dd.Substring(0, drl).CreateDivisor();
f = d^dr.CreateDivisor();
p = d > dd.CreateDivisor();
}
return f.ToString();
}
Я знаю, что это может быть закрыл запрос кода, но, пожалуйста, несите меня, поскольку я действительно этого не понимаю. Другая проблема заключается в том, что нет реальной документации, которая помогла мне разобраться.
В любом случае, если вы знаете один хороший документ, который решает мою проблему, пожалуйста, добавьте его в качестве комментария. Я проверю это и закрою ответ, если я его получу.
Как "CRC-16" может быть 15 бит? (15x) –
@ Последний бит LastLare зарезервирован и всегда 1 – cramopy
Посмотрев на https://en.wikipedia.org/wiki/CAN_bus#Data_frame, кажется, что сначала вы вычисляете CRC на битах до CRC, то вы добавляете CRC, затем выполняете битовую начинку (замену), затем добавляете два бита ACK и другие биты (конец кадра и IFS). – xanatos