|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Всем привет. С 1 марта 2019 г. необходимо передавать через онлайн-кассы сведения о марках табачной продукции. Хотя самих марок я в глаза еще не видел, но надо потихонечку готовится к этому. Проблема возникла с преобразованием кода товара в бинарный формат. Алгоритм записи тега 1162 (Код товарной номенклатуры) при кодировании данных при маркировке табачной продукции. 1. Код типа маркировки Байты [1:2] (2 байта) - Код типа маркировки Постоянное значение: 00 05 2. Идентификатор продукта GTIN Байты [3:8] (6 байт) – GTIN Используется 14 разрядный GTIN, при записи в ККТ, GTIN представляется как десятичное 14 знаковое число и преобразуется в BIN (big endian), размером 6 байт. Если после преобразования получается менее 6, то следует добавить лидирующие нули. 3. Код идентификации упаковки табачной продукции Байты [9:15] (7 байт) - Serial Serial содержит в себе цифры, заглавные и строчные буквы латинского алфавита. Строкове значение, в кодировке CPP 866, размер – 7 байт 4. Резерв Байты [22:32] (11 байт) – зарезервированы, и не используются. Резерв в ККТ не передается 5. Пример формирования тега 1162 Имеем следующие данные по марке: GTIN: 98765432101234 Преобразуем GTIN в бинарный формат: 59 D3 9E 7F 19 72 Serial: ABC1234 Преобразуем в строковое значение: 41 42 43 31 32 33 34 Формируем тег 1162: Добавляем код типа маркировки: 00 05 Формируем TLV для передачи в ККТ. Так как тег 1162 не имеет фиксированное значение, 11 байт резерва в ККТ не передаются: 8A 04 0F 00 00 05 59 D3 9E 7F 19 72 41 42 43 31 32 33 34 Значение 8A 04 – номер тега (1162) 0F 00 – длина данных (15 байт КТН) Загвоздка возникла с 5 пунктом: Имеем следующие данные по марке: GTIN: 98765432101234 Преобразуем GTIN в бинарный формат: 59 D3 9E 7F 19 72 Serial: ABC1234 Преобразуем в строковое значение: 41 42 43 31 32 33 34 При переводе строки 549756338181 в бинарный (если правильно понимаю, он же двоичный) формат получаю 1000000000000000000010000000000000000101 , а надо что то типа 59 D3 9E 7F 19 72 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
ПС: Может немного лишнего написал, но это для полноты картины. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 11:17 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Шаман, если нужно строкой то можно так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
функция fixLength абстрактная, которая всегда возвращает строку фиксированной длины ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 11:49 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Swa111функция fixLength абстрактная, которая всегда возвращает строку фиксированной длины Спасибо за совет. Пробую разобраться с fixLength. Выдает ошибку что функция не определена. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 12:30 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Шаман, Я имел ввиду что готовой функции нет. ее нужно самому написать по следующему условию. Если длина строки меньше требуемой то добиваем слева/справа символами пустышками (обычно пробел). Если строка больше требуемой длины то отрезаем лишнее слева/справа ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 13:51 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
ШаманПробую разобраться с fixLength. Выдает ошибку что функция не определена. Вам же написали - "функция fixLength абстрактная ", т.е. ее надо сочинить. Средствами VBA такое большое число не преобразовать. Это умеет, например, Java. В инете нарыл такой пример на Java: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9.
В VBA этот код можно выполнить, используя MSScriptControl: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Пример: Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 14:05 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Кривцов Анатолий, типа Double должно хватить ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 14:14 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Swa111 и Кривцов Анатолий, Спасибо за разъяснения и примеры. Попробую разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 15:03 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Swa111типа Double должно хватить Код: vbnet 1. 2.
Это максимальное число (т.е. Long), дальше - переполнение. В Ёкселе есть функция "ДЕС.В.ШЕСТН" ("Dec2Hex"), о на может больше, но и этого недостаточно. Формула в ячейке =ДЕС.В.ШЕСТН(2^39-1) возвращает 7FFFFFFFFF (5 неполных байт). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 15:11 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Шаман, Пример от Кривцов Анатолий с MSScriptControl действительно стреляет как нужно, единственное для унификации слегка немного допилить (на вход процедуры подавать строку, дабы не было коллизий, а внутри её преобразовывать в Double) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Вот только не понятно что это за хрень такая: Шаман Serial: ABC1234 Преобразуем в строковое значение: 41 42 43 31 32 33 34 Это точно не Asc ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 16:47 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
vmag, Мдя... хотел в первой и восьмой строке выделить важное, как обычно бывает... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 16:49 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
vmagВот только не понятно что это за хрень такая: Шаман Serial: ABC1234 Преобразуем в строковое значение: 41 42 43 31 32 33 34 Это точно не Asc Это точно Asc, только в Hex. Код: vbnet 1. 2. 3. 4.
vmagдля унификации слегка немного допилить (на вход процедуры подавать строку, дабы не было коллизий, а внутри её преобразовывать в Double) А чем вас не устраивает Variant? "дабы не было коллизий", можно проверить IsNumeric(). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 17:28 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Кривцов Анатолий и vmag , спасибо за примеры и доработку. Первоначальный вариант у меня почему то не заработал, но после "допила" vmag все взлетело) Serial обработал так: Код: vbnet 1.
Еще раз ОГРОМНОЕ СПАСИБО за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 18:17 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
ШаманНемого громоздко получилось А вдруг длина серийника не 7 символов ? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 20:05 |
|
Перевод строки в бинарный формат
|
|||
---|---|---|---|
#18+
Кривцов АнатолийА чем вас не устраивает Variant? "дабы не было коллизий", можно проверить IsNumeric(). Анатолий, спасибо за Hex... Ну я всегда перестраховываюсь, сказали что лонга мало, а дабла должно хватить, вот я и залудил конкретно... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2019, 20:12 |
|
|
start [/forum/topic.php?fid=45&msg=39763035&tid=1610895]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 144ms |
0 / 0 |