dolphin_dw Пользователь Сообщений: 3 |
Господа, очень прошу помощи в написании кода для расчета контрольной суммы в Excel. Для примера: Задача такая в дальнейшем — разложить байты строки на биты по каждой функции. Изменяя биты руками для каждой функции хочу сделать чтоб автоматом менялась строка и автоматом рассчитывалась контролька. Прикрепленные файлы
|
bedvit Пользователь Сообщений: 2477 Виталий |
Вы бы приложили пример, что должно быть до и после обработки. И то, что у вас не получается, в чем нужна помощь. Шансы на помощь возрастут. «Бритва Оккама» или «Принцип Калашникова»? |
dolphin_dw Пользователь Сообщений: 3 |
к сожалению что на выходе должно получиться у меня только в голове . А помощь нужна в написании кода скрипта или как программу … Не силен я уже в программировании. Когда то C++ в детстве изучал…уже не помню ничего |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#5 18.11.2019 20:32:05
вот и расскажите, что у вас в голове (касательно данной задачи) Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
dolphin_dw, посмотрите на свой #3 — на чём хотели сделать акцент, процитировав всё подряд? Даже подпись захватили. Вернитесь и удалите то, что Вы ошибочно считаете цитатой. |
bedvit Пользователь Сообщений: 2477 Виталий |
#7 19.11.2019 00:51:09 БМВ, Михаил, признаюсь честно, не приходилось встречаться с CRC . Почитал матчасть. Спасибо за ссылки.
для этого-то и нужны ваши примеры и алгоритм. Что получилось и где нужна помощь. Изменено: bedvit — 19.11.2019 00:51:37 «Бритва Оккама» или «Принцип Калашникова»? |
||
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
bedvit, Виталий, мат часть тут на работе бегло взглянул и ….. По вопросам из тем форума, личку не читаю. |
человечеством уже придумано множество вариантов контроля целостности данных CRC . Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
dolphin_dw Пользователь Сообщений: 3 |
Я вас понял. сегодня тогда накидаю таблицу для наглядности, как это должно выглядеть и сделаю описание как это должно работать. |
sokol92 Пользователь Сообщений: 4446 |
#11 19.11.2019 15:03:32 Есть толковое описание от одного из корифеев этого дела на русском языке. Владимир |
Имеется вот такое число (чисел много)
01C437030000000000000400080000EF898E521E007017040500000000
необходимо побайтно сложить и в итоге получить контрольную сумму обрезаную до последнего (младшего) байта
т.е.
01+C4+37+03+00+00+00+00+00+00+04+00+08+00+00+EF+89+8E+52+1E+00+70+17+04+05+00+00+00+00 = 0х411
значит контрольная сумма 0х11 (т.е. младший байт от неё)
Подскажите как это сделать без сложного программирования?
Не понял, почему
01+C4+37+03+00+00+00+00+00+00+04+00+08+00+00+EF+89+8E+52+1E+00+70+17+04+05+00+00+00+00 = 0х411 ?
если сложить эти числа в калькуляторе виндовс (в режиме Hex), то результат как раз 411 (это в шестнадцатеричном формате)
0х411 ну или в десятичном 1041.
Но интересует шестнадцатеричный формат
A+B = 15 (в шест. виде)
01+C4+37 = FC
ну и так далее
01+C4+37+03+00+00+00+00+00+00+04+00+08+00+00+EF+89+8E+52+1E+00+70+17+04+05+00+00+00+00 = 411 (в шестн. виде)
есть такой калькулятор который считает в шестн. виде calc
но я просто складывал обычным виндовсовским.
Вариант через вычисления во вспомогательных столбцах(см.вложение для Excel2003)
необходимо установить и загрузить надстройку «Пакет анализа» СервисНадстройкиПакет анализа
p.s. Больше похоже не на 16-тиричную, а на 256-тиричную систему
без доп. ячеек:
="0x"&ДЕС.В.ШЕСТН(СУММПРОИЗВ((ПОИСКПОЗ(ПСТР(ПСТР(A3;(СТРОКА(A$1:ИНДЕКС(A:A;ДЛСТР(A3)/2))-1)*2+1;2);{1;2};1);{"0":"1":"2":"3":"4":"5":"6":"7":"8":"9":"A":"B":"C":"D":"E":"F"};)-1)*{16;1}))
Можно так еще:
=»0x»&ДЕС.В.ШЕСТН(СУММПРОИЗВ(ШЕСТН.В.ДЕС(ПСТР(A3;(СТРОКА($1:$99)-1)*2+1;2))))
Webmoney: E350157549801 Z116603216205 R268084006579
Цитата: kimtan от 10.03.2011, 20:32
Можно так еще:
=»0x»&ДЕС.В.ШЕСТН(СУММПРОИЗВ(ШЕСТН.В.ДЕС(ПСТР(A3;(СТРОКА($1:$99)-1)*2+1;2))))
Игорь, сам хотел такую вот написать:
=»0x»&ДЕС.В.ШЕСТН(СУММПРОИЗВ(ШЕСТН.В.ДЕС(ПСТР(A3;(СТРОКА(A$1:ИНДЕКС(A:A;ДЛСТР(A3)/2))-1)*2+1;2))))
так она у меня в 2003 ошибку #ЗНАЧ! выдает (твоя кстати тоже), что то не работает ШЕСТН.В.ДЕС с массивами.
Вот и пришлось извращатся с ПОИСКПОЗ
ОЧЕРТЕНЕТЬ !
работает ! как работает — не понял, но действительно вычисляет верно.
Ноги у этой задачи растут из проблемы получение числа, примерно такого вида:
«ТИП СООБЩЕНИЯ»&»КОД УСТРОЙСТВА»&»НЕМАЛЕНЬКОЕ 16-тиричное ЧИСЛО»&»КОНТРОЛЬНАЯ СУММА»
а «КОНТРОЛЬНАЯ СУММА» это и есть сумма всех предыдущих байт.
В итоге полученное число (всё, вместе с контр.суммой) — код который посылается на физическое устройство.
А таких устройств достаточно много, около 10 000.
Спасибо большое, сам ни за что не дошел бы.
Цитата: MCH от 11.03.2011, 00:33
…она у меня в 2003 ошибку #ЗНАЧ! выдает (твоя кстати тоже), что то не работает ШЕСТН.В.ДЕС с массивами…
Ну что тут скажешь?! Значит еще один маленький плюсик 2010-ому
Webmoney: E350157549801 Z116603216205 R268084006579
Excel 2003 EN, 2013 EN |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Некоторое время назад понадобилось сгенерировать много чисел в формате EAN-13. Загвоздка была в расчете последней контрольной цифры в коде.Небольшой поиск в Сети принес эту формулу. Чтобы в следующий раз не искать — пусть здесь полежит.
Формула выводит все 13 цифр включая последнюю контрольную.
=[cell]*10+MOD (10-MOD (3*(MID ([cell];2;1)+MID ([cell];4;1)+MID ([cell];6;1)+MID ([cell];8;1)+MID ([cell];10;1)+MID ([cell];12;1))+MID ([cell];1;1)+MID ([cell];3;1)+MID ([cell];5;1)+MID ([cell];7;1)+MID ([cell];9;1)+MID ([cell];11;1);10);10)
[cell] — ячейка в которой 12-значный штрих-код.
В русской версии Excel вместо функций MOD и MID поставить ОСТАТ и ПСТР сответственно:
=[cell]*10+ОСТАТ(10-ОСТАТ(3*(ПСТР([cell];2;1)+ПСТР([cell];4;1)+ПСТР([cell];6;1)+ПСТР([cell];8;1)+ПСТР([cell];10;1)+ПСТР([cell];12;1))+ПСТР([cell];1;1)+ПСТР([cell];3;1)+ПСТР([cell];5;1)+ПСТР([cell];7;1)+ПСТР([cell];9;1)+ПСТР([cell];11;1);10);10)
Для быстрого анализа данных протокола SPI (показания магнитометра погрузчика Jungenricht) из Salea logic, импортировал их в Excel. Для вычисления CRC понадобилось реализовать функцию вычисления (прототип взят из сети и доработан).
Сервис->Макрос->Редактор Visual Basic, встаем на проект Insert->Module.
Вставляем следующий код:
Public Function CRC8_8H2F(ByVal AppID As String) As Variant
Dim table() As Variant
table = Array(&H0, &H2F, &H5E, &H71, &HBC, &H93, &HE2, &HCD, &H57, &H78, &H9, &H26, &HEB, &HC4, &HB5, &H9A, _
&HAE, &H81, &HF0, &HDF, &H12, &H3D, &H4C, &H63, &HF9, &HD6, &HA7, &H88, &H45, &H6A, &H1B, &H34, _
&H73, &H5C, &H2D, &H2, &HCF, &HE0, &H91, &HBE, &H24, &HB, &H7A, &H55, &H98, &HB7, &HC6, &HE9, _
&HDD, &HF2, &H83, &HAC, &H61, &H4E, &H3F, &H10, &H8A, &HA5, &HD4, &HFB, &H36, &H19, &H68, &H47, _
&HE6, &HC9, &HB8, &H97, &H5A, &H75, &H4, &H2B, &HB1, &H9E, &HEF, &HC0, &HD, &H22, &H53, &H7C, _
&H48, &H67, &H16, &H39, &HF4, &HDB, &HAA, &H85, &H1F, &H30, &H41, &H6E, &HA3, &H8C, &HFD, &HD2, _
&H95, &HBA, &HCB, &HE4, &H29, &H6, &H77, &H58, &HC2, &HED, &H9C, &HB3, &H7E, &H51, &H20, &HF, _
&H3B, &H14, &H65, &H4A, &H87, &HA8, &HD9, &HF6, &H6C, &H43, &H32, &H1D, &HD0, &HFF, &H8E, &HA1, _
&HE3, &HCC, &HBD, &H92, &H5F, &H70, &H1, &H2E, &HB4, &H9B, &HEA, &HC5, &H8, &H27, &H56, &H79, _
&H4D, &H62, &H13, &H3C, &HF1, &HDE, &HAF, &H80, &H1A, &H35, &H44, &H6B, &HA6, &H89, &HF8, &HD7, _
&H90, &HBF, &HCE, &HE1, &H2C, &H3, &H72, &H5D, &HC7, &HE8, &H99, &HB6, &H7B, &H54, &H25, &HA, _
&H3E, &H11, &H60, &H4F, &H82, &HAD, &HDC, &HF3, &H69, &H46, &H37, &H18, &HD5, &HFA, &H8B, &HA4, _
&H5, &H2A, &H5B, &H74, &HB9, &H96, &HE7, &HC8, &H52, &H7D, &HC, &H23, &HEE, &HC1, &HB0, &H9F, _
&HAB, &H84, &HF5, &HDA, &H17, &H38, &H49, &H66, &HFC, &HD3, &HA2, &H8D, &H40, &H6F, &H1E, &H31, _
&H76, &H59, &H28, &H7, &HCA, &HE5, &H94, &HBB, &H21, &HE, &H7F, &H50, &H9D, &HB2, &HC3, &HEC, _
&HD8, &HF7, &H86, &HA9, &H64, &H4B, &H3A, &H15, &H8F, &HA0, &HD1, &HFE, &H33, &H1C, &H6D, &H42)
Dim crc As Byte Dim AppIDarray() As Byte Dim pos As Byte AppIDarray = HexToByte(AppID) aidLength = UBound(AppIDarray) crc = &HFF For j = 0 To aidLength pos = AppIDarray(j) Xor crc crc = table(pos) Next j crc = crc Xor &HFF CRC8_8H2F = Hex(crc) 'CRC8_8H2F = AppIDarray(1) End Function
Public Function HexToByte(strHex As String) As Byte()
Dim i As Integer
Dim tempByte As Byte
Dim outBytes() As Byte
ReDim outBytes(Len(strHex) 2 - 1)
For i = 0 To Len(strHex) 2 - 1
For j = 0 To 1
char = Mid(strHex, i * 2 + j + 1, 1)
Select Case char
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
tempByte = tempByte Or (Asc(char) - 48)
Case "A", "B", "C", "D", "E", "F":
tempByte = tempByte Or (Asc(char) - 55)
Case "a", "b", "c", "d", "e", "f":
tempByte = tempByte Or (Asc(char) - 87)
End Select
If j = 0 Then
tempByte = tempByte * 2 ^ 4
Else
outBytes(i) = tempByte
tempByte = 0
End If
Next
Next
HexToByte = outBytes
End Function
Вызов из любой ячейки следующим образом.
=CRC8_8H2F(«12345678abcdef»).