Engineering tools · EPC · GS1

Конвертер RFID-кода

Инструмент преобразования между SGTIN-96 (RFID Hex) и Штрих-кодом (GTIN) + Серийным номером. Совместим со стандартными RFID-считывателями, такими как Zebra, Chainway, Impinj, Nextwaves. Основан на GS1 EPC Tag Data Standard.

Конвертер RFID

Преобразование между RFID Hex (SGTIN-96) и штрихкодом GS1 (GTIN) + серийный номер.

Scheme:SGTIN-9696 bits / Header 0x30

Логика кода и пошаговая инструкция

// 1. Binary Conversion

src = bin(0x3076215F0C5D974000000001) // = "001100000111011000100001010111110000110001011101100101110100000000000000000000000000000000000001"

// 2. Extract Fields (Bit Slice)

header = src[0:8] "00110000" 0x30
filter = src[8:11] "011" 3
partition = src[11:14] "101" 5

// 3. Determine Partition Rule (Partition 5)

rule = PARTITIONS[5]
// Company Bits: 24, Item Bits: 20

// 4. Extract Company, Item & Serial

company = src[14:38] "100010000101011111000011" 8935363
itemRef = src[38:58] "00010111011001011101" 095837
serial = src[58:96] "00000000000000000000000000000000000001" 1

Код разработчика

Используйте эту логику утилиты в своем проекте. Выберите язык ниже.

1// TypeScript / JavaScript SGTIN-96 Utils
2
3export const GS1_PARTITION_TABLE = [
4  { value: 0, partition: 0, companyPrefixBits: 40, itemReferenceBits: 4, companyDigits: 12, itemDigits: 1 },
5  { value: 1, partition: 1, companyPrefixBits: 37, itemReferenceBits: 7, companyDigits: 11, itemDigits: 2 },
6  { value: 2, partition: 2, companyPrefixBits: 34, itemReferenceBits: 10, companyDigits: 10, itemDigits: 3 },
7  { value: 3, partition: 3, companyPrefixBits: 30, itemReferenceBits: 14, companyDigits: 9, itemDigits: 4 },
8  { value: 4, partition: 4, companyPrefixBits: 27, itemReferenceBits: 17, companyDigits: 8, itemDigits: 5 },
9  { value: 5, partition: 5, companyPrefixBits: 24, itemReferenceBits: 20, companyDigits: 7, itemDigits: 6 },
10  { value: 6, partition: 6, companyPrefixBits: 20, itemReferenceBits: 24, companyDigits: 6, itemDigits: 7 },
11];
12
13export function encodeSgtin96(gtin: string, serial: string, filter: number) {
14  gtin = gtin.padStart(14, "0");
15  const p = GS1_PARTITION_TABLE.find(rule => {
16    const cp = parseInt(gtin.slice(1, 1 + rule.companyDigits));
17    const ir = parseInt(gtin[0] + gtin.slice(1 + rule.companyDigits, 13));
18    return cp < (1 << rule.companyPrefixBits) && ir < (1 << rule.itemReferenceBits);
19  });
20  if (!p) throw new Error("Invalid GTIN for SGTIN-96");
21
22  const cpVal = parseInt(gtin.slice(1, 1 + p.companyDigits));
23  const irVal = parseInt(gtin[0] + gtin.slice(1 + p.companyDigits, 13));
24  
25  let b = (0x30).toString(2).padStart(8,"0");
26  b += filter.toString(2).padStart(3,"0");
27  b += p.partition.toString(2).padStart(3,"0");
28  b += cpVal.toString(2).padStart(p.companyPrefixBits,"0");
29  b += irVal.toString(2).padStart(p.itemReferenceBits,"0");
30  b += parseInt(serial).toString(2).padStart(38,"0");
31  return binaryToHex(b);
32}
33
34export function decodeSgtin96(hex: string) {
35  const b = hexToBinary(hex);
36  const pVal = parseInt(b.substring(11, 14), 2);
37  const rule = GS1_PARTITION_TABLE.find(r => r.partition === pVal);
38  if (!rule) throw new Error("Invalid Partition");
39
40  const cp = parseInt(b.substring(14, 14 + rule.companyPrefixBits), 2);
41  const ir = parseInt(b.substring(14 + rule.companyPrefixBits, 14 + rule.companyPrefixBits + rule.itemReferenceBits), 2);
42  const serial = parseInt(b.substring(14 + rule.companyPrefixBits + rule.itemReferenceBits, 96), 2);
43
44  const cpStr = cp.toString().padStart(rule.companyDigits, "0");
45  const irStr = ir.toString().padStart(rule.itemDigits, "0");
46  const gtinCore = irStr[0] + cpStr + irStr.substring(1);
47
48  // Check digit calculation
49  let sum = 0;
50  for (let i = 0; i < 13; i++) {
51    sum += parseInt(gtinCore[i]) * (i % 2 === 0 ? 3 : 1);
52  }
53  const check = (10 - (sum % 10)) % 10;
54  
55  return {
56    gtin: gtinCore + check,
57    serial: serial.toString()
58  };
59}
60
61function binaryToHex(b: string) {
62  let hex = "";
63  for (let i = 0; i < b.length; i += 4) {
64    hex += parseInt(b.substring(i, i + 4), 2).toString(16).toUpperCase();
65  }
66  return hex;
67}
68
69function hexToBinary(h: string) {
70  let bin = "";
71  for (let i = 0; i < h.length; i++) {
72    bin += parseInt(h[i], 16).toString(2).padStart(4, "0");
73  }
74  return bin;
75}

Объяснить

SGTIN-96. это 96-битная двоичная строка, разделенная на 6 частей:

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
Заголовок (8 бит)Bits 0-8 (8)
001100000x30

Стандартный префикс (00110000), определяющий его как SGTIN-96.

Фильтр (3 бита)Bits 8-11 (3)
0113

Тип объекта (например, 1 = Retail Retail). См. справочное руководство ниже.

Раздел (3 бита)Bits 11-14 (3)
1015

Раздел 5 означает: Код компании занимает 24 бит, код продукта занимает 20 бит.

Префикс компанииBits 14-38 (24)
1000100001010111110000118935363

Уникальный код компании, присвоенный GS1.

Артикул товараBits 38-58 (20)
00010111011001011101095837

Ваш конкретный код продукта.

Серийный номер (38 бит)Bits 58-96 (38)
000000000000000000000000000000000000011

Уникальный идентификатор для каждого конкретного физического продукта.

Визуализация взаимосвязи между вашим физическим штрих-кодом и электронным кодом продукта (EPC).

Диаграмма, показывающая связь между штрих-кодом (GTIN) и URI SGTIN-96
  1. Шаг 1: Определите двоичное значение заголовка для схемы EPC. Двоичное значение заголовка для SGTIN-96. «00110000».
  2. Шаг 2: Выберите значение раздела на основе количества цифр в префиксе компании из таблицы значений раздела.
  3. Шаг 3: Преобразуйте значение фильтра, значение раздела, префикс компании, ссылку на товар и серийный номер в двоичное значение.
  4. Шаг 4: Объедините в порядке заголовка, фильтра, раздела, префикса компании, ссылки на товар и двоичных значений серийного номера, чтобы сформировать двоичный EPC.

Справочник SGTIN-96

ЗначениеОписание
0Все остальные
Используется для товаров, которые не подходят под другие категории. Редко используется в розничной торговле.
1Товар для продажи (POS)
Стандартная потребительская единица, продаваемая в точке продажи. Пример: одна бутылка шампуня.
2Полный кейс для транспортировки
Стандартная транспортная единица, содержащая несколько товаров. Пример: коробка из 12 бутылок шампуня. Критически важно для логистики, чтобы отличить «один кейс» от «одного товара».
3Зарезервировано
Зарезервировано для будущего использования.
4Группировка товаров во внутренней упаковке
Группировка меньше полного кейса, часто для отображения на полке или обработки. Пример: термоусадочная упаковка из 3 штук внутри основной коробки.
5Зарезервировано
Зарезервировано для будущего использования.
6Единица загрузки
Крупная логистическая единица, обычно паллета, содержащая несколько коробок.
7Компонент внутри потребительской единицы
Конкретная деталь внутри потребительской единицы. Пример: крышка батарейного отсека внутри игрушки.
ЗначениеПрефикс компанииСсылка на товар
040 Биты / 12 Цифры4 Биты / 1 Цифры
137 Биты / 11 Цифры7 Биты / 2 Цифры
234 Биты / 10 Цифры10 Биты / 3 Цифры
330 Биты / 9 Цифры14 Биты / 4 Цифры
427 Биты / 8 Цифры17 Биты / 5 Цифры
524 Биты / 7 Цифры20 Биты / 6 Цифры
620 Биты / 6 Цифры24 Биты / 7 Цифры

Часто задаваемые вопросы по SGTIN-96

  • Он сообщает системе об уровне упаковки метки. Если система считывает метку 'Case' (Фильтр 2), она знает, что она содержит несколько элементов. Это предотвращает двойной учет (например, учет кейса как одной единицы) и позволяет выполнять действительную проверку отгрузки.
  • Case (Фильтр 2). основная транспортная единица, используемая для транспортировки. Inner Pack (Фильтр 4). это подразделение внутри этого кейса, обычно для облегчения обработки или отображения (например, упаковка из 6 штук внутри кейса из 24 банок). Логистические системы отслеживают Cases; Операции в магазине могут эффективно обрабатывать Inner Packs.
  • Декодирование завершится неудачей или выдаст неверный штрих-код. Раздел точно определяет, где заканчивается префикс компании и начинается ссылка на элемент. Если эта «точка разделения» неверна, вы получите другой код компании, чем предполагалось.
  • Стандартный GTIN (штрих-код) идентифицирует только тип продукта (например, '12 унций соды'). SGTIN-96 добавляет серийный номер, присваивая каждой отдельной банке уникальный идентификатор. Это обеспечивает отслеживаемость на уровне элемента, позволяя вам отслеживать, какой именно конкретный элемент был продан, украден или истек срок его годности.
  • Да. Как показано в конвертере выше, строка SGTIN-96 содержит полный GTIN-14. Удалив серийный номер и информацию заголовка, вы можете идеально восстановить исходный розничный штрих-код.
  • Заголовок (0x30). это стандартный 8-битный префикс, определенный GS1. Он просто сообщает любому RFID-считывателю: «Эта метка закодирована с использованием стандарта SGTIN-96». Существуют другие заголовки для разных стандартов (например, SSCC для поддонов или GIAI для активов).