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.
  • Декодування не вдасться або створить неправильний штрих-код. Partition точно визначає, де закінчується Company Prefix і починається Item Reference. Якщо ця 'точка поділу' неправильна, ви отримаєте інший Company Code, ніж передбачалося.
  • Стандартний GTIN (Штрих-код) визначає лише тип продукту (наприклад, '12oz Soda'). SGTIN-96 додає Serial Number, надаючи кожній окремій банці унікальну ідентичність. Це забезпечує відстеження на рівні окремих товарів, дозволяючи відстежувати, який саме товар було продано, вкрадено або термін придатності якого закінчився.
  • Так. Як показано у конвертері вище, рядок SGTIN-96 містить повний GTIN-14. Видаливши Serial Number та інформацію заголовка, ви можете ідеально відтворити оригінальний штрих-код роздрібної торгівлі.
  • The Header (0x30). це стандартний 8-бітний префікс, визначений GS1. Він просто повідомляє будь-якому RFID-зчитувачу: "Ця мітка закодована за стандартом SGTIN-96." Існують інші заголовки для різних стандартів (наприклад, SSCC для піддонів або GIAI для активів).