powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перевод строки в бинарный формат
15 сообщений из 15, страница 1 из 1
Перевод строки в бинарный формат
    #39762689
Шаман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
С 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.
Function TestNumberToBits2()
Dim v As Variant, i As Integer, s As String
v = CDec(код)
 For i = 40 To 0 Step -1
  If v >= CDec(2 ^ i) Then
    s = s & "1"
    v = v - CDec(2 ^ i)
  ElseIf s <> "" Then
    s = s & "0"
  End If
 Next
TextBox2 = s
Debug.Print s
End Function

Может кто подскажет, что делаю не так или чего не доделал?
ПС: Может немного лишнего написал, но это для полноты картины.
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762705
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шаман,

если нужно строкой то можно так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
function Int2Str(n, c)
  for i = 1 to c
    Int2Str =  chr(n mod 256) & Int2Str
    n = n \ 256
  next
end function;


cod= chr(&h8A) &  chr(04) & chr(&h0F) &  chr(00) & chr(00) & chr(05) & Int2Str(gtin, 6) & fixLength(serial, 7) 



функция fixLength абстрактная, которая всегда возвращает строку фиксированной длины
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762734
Шаман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111функция fixLength абстрактная, которая всегда возвращает строку фиксированной длины Спасибо за совет. Пробую разобраться с fixLength. Выдает ошибку что функция не определена.
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762812
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шаман,

Я имел ввиду что готовой функции нет. ее нужно самому написать по следующему условию. Если длина строки меньше требуемой то добиваем слева/справа символами пустышками (обычно пробел). Если строка больше требуемой длины то отрезаем лишнее слева/справа
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762832
ШаманПробую разобраться с fixLength. Выдает ошибку что функция не определена. Вам же написали - "функция fixLength абстрактная ", т.е. ее надо сочинить.
Средствами VBA такое большое число не преобразовать. Это умеет, например, Java.
В инете нарыл такой пример на Java:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

В VBA этот код можно выполнить, используя MSScriptControl:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Function DecToHex(DecVal)
'Преобразование больших десятичных чисел в HEX строку
Dim FuncBody As String, HexVal As String
Dim objScript As Object
'Dim objScript As New MSScriptControl.ScriptControl
    Set objScript = CreateObject("MSScriptControl.ScriptControl")
    objScript.Language = "JScript" '"VBScript"
    FuncBody = "function decimalToHexString(number)" & vbCrLf & "{" _
        & "if (number < 0)" & vbCrLf & "{" & vbCrLf & "number = 0xFFFFFFFF + number + 1;" & vbCrLf & "}" _
        & "return number.toString(16).toUpperCase();" & vbCrLf & "}"
    
    objScript.AddCode FuncBody
    HexVal = objScript.Run("decimalToHexString", DecVal)
    
    If (Len(HexVal) Mod 2) > 0 Then HexVal = "0" & HexVal
    DecToHex = HexVal
End Function

Пример:
Код: vbnet
1.
2.
?DecToHex(98765432101234)
59D39E7F1972
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762841
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кривцов Анатолий,

типа Double должно хватить
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762886
Шаман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111 и Кривцов Анатолий,
Спасибо за разъяснения и примеры. Попробую разобраться.
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762896
Swa111типа Double должно хватить
Код: vbnet
1.
2.
?Hex(2^31-1)
7FFFFFFF

Это максимальное число (т.е. Long), дальше - переполнение.

В Ёкселе есть функция "ДЕС.В.ШЕСТН" ("Dec2Hex"), о на может больше, но и этого недостаточно.
Формула в ячейке =ДЕС.В.ШЕСТН(2^39-1) возвращает 7FFFFFFFFF (5 неполных байт).
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762969
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаман,

Пример от Кривцов Анатолий с 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.
Function DecToHex(s As String) As String
On Error GoTo er1
DecToHex = ""
'Преобразование больших десятичных чисел в HEX строку
Dim DecVal As Double
Dim FuncBody As String, HexVal As String
Dim objScript As Object
DecVal = CDbl(s)
'Dim objScript As New MSScriptControl.ScriptControl
    Set objScript = CreateObject("MSScriptControl.ScriptControl")
    objScript.Language = "JScript" '"VBScript"
    FuncBody = "function decimalToHexString(number)" & vbCrLf & "{" _
        & "if (number < 0)" & vbCrLf & "{" & vbCrLf & "number = 0xFFFFFFFF + number + 1;" & vbCrLf & "}" _
        & "return number.toString(16).toUpperCase();" & vbCrLf & "}"
    
    objScript.AddCode FuncBody
    HexVal = objScript.Run("decimalToHexString", DecVal)
    
    If (Len(HexVal) Mod 2) > 0 Then HexVal = "0" & HexVal
    DecToHex = HexVal
Exit Function
er1:
MsgBox "Ошибка функции!"
End Function



Вот только не понятно что это за хрень такая:

Шаман Serial: ABC1234
Преобразуем в строковое значение: 41 42 43 31 32 33 34


Это точно не Asc
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39762971
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

Мдя... хотел в первой и восьмой строке выделить важное, как обычно бывает...
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39763003
vmagВот только не понятно что это за хрень такая:

Шаман Serial: ABC1234
Преобразуем в строковое значение: 41 42 43 31 32 33 34


Это точно не Asc Это точно Asc, только в Hex.
Код: vbnet
1.
2.
3.
4.
?Hex(Asc("A"))
41
?Hex(Asc("1"))
31



vmagдля унификации слегка немного допилить (на вход процедуры подавать строку, дабы не было коллизий, а внутри её преобразовывать в Double) А чем вас не устраивает Variant? "дабы не было коллизий", можно проверить IsNumeric().
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39763035
Шаман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кривцов Анатолий и vmag , спасибо за примеры и доработку.
Первоначальный вариант у меня почему то не заработал, но после "допила" vmag все взлетело)
Serial обработал так:
Код: vbnet
1.
cod = Hex(Asc(Left(serial, 1))) & " " & Hex(Asc(Right(Left(serial, 2), 1))) & " " & Hex(Asc(Right(Left(serial, 3), 1))) & " " & Hex(Asc(Right(Left(serial, 4), 1))) & " " & Hex(Asc(Right(Left(serial, 5), 1))) & " " & Hex(Asc(Right(Left(serial, 6), 1))) & " " & Hex(Asc(Right(Left(serial, 7), 1)))

Немого громоздко получилось, но результат достигнут.
Еще раз ОГРОМНОЕ СПАСИБО за помощь.
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39763092
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШаманНемого громоздко получилось

А вдруг длина серийника не 7 символов ?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Function Serial(s As String) As String
On Error GoTo er1
Dim i As Long
Dim j As Long
Serial = ""
i = Len(s)

If i > 0 Then
 For j = 1 To i
  Serial = Serial & CStr(Hex(Asc(Mid(s, j, 1)))) & " "
 Next j
 Serial = Trim(Serial)
End If

Exit Function
er1:
MsgBox "Ошибка!"
End Function
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39763095
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов АнатолийА чем вас не устраивает Variant? "дабы не было коллизий", можно проверить IsNumeric().

Анатолий, спасибо за Hex...
Ну я всегда перестраховываюсь, сказали что лонга мало, а дабла должно хватить, вот я и залудил конкретно...
...
Рейтинг: 0 / 0
Перевод строки в бинарный формат
    #39763141
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаман,

У меня в профиле есть мыло, напишите мне, постараюсь не затягивать с ответом, здается мне - идете не туда и пока на пол пути...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перевод строки в бинарный формат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]