Engineering tools · EPC · GS1

Convertisseur de code RFID

Outil de conversion entre SGTIN-96 (RFID Hex) et Code-barres (GTIN) + Numéro de série. Compatible avec les lecteurs RFID standard comme Zebra, Chainway, Impinj, Nextwaves. Basé sur le GS1 EPC Tag Data Standard.

Convertisseur RFID

Convertir entre RFID Hex (SGTIN-96) et GS1 Code-barres (GTIN) + Numéro de série.

Scheme:SGTIN-9696 bits / Header 0x30

Logique du code et étapes

// 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

Code développeur

Utilisez cette logique utilitaire dans votre projet. Sélectionnez un langage ci-dessous.

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}

Explication

SGTIN-96 est une chaîne binaire de 96 bits divisée en 6 parties :

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
En-tête (8 bit)Bits 0-8 (8)
001100000x30

Préfixe standard (00110000) identifiant ce format comme SGTIN-96.

Filtre (3 bit)Bits 8-11 (3)
0113

Type d'objet (ex. : 1 = Produit de détail). Voir le guide de référence ci-dessous.

Partition (3 bit)Bits 11-14 (3)
1015

La partition 5 signifie : le code entreprise occupe 24 bits, le code produit occupe 20 bits.

Préfixe entrepriseBits 14-38 (24)
1000100001010111110000118935363

Code d'entreprise unique attribué par GS1.

Référence articleBits 38-58 (20)
00010111011001011101095837

Votre code produit spécifique.

Numéro de série (38 bit)Bits 58-96 (38)
000000000000000000000000000000000000011

Identifiant unique pour chaque produit physique spécifique.

Visualiser la relation entre votre code-barres physique et le code produit électronique (EPC).

Diagramme montrant la connexion entre le code-barres (GTIN) et l'URI SGTIN-96
  1. Étape 1 : Déterminer la valeur d'en-tête binaire pour le schéma EPC. La valeur d'en-tête binaire pour SGTIN-96 est « 00110000 ».
  2. Étape 2 : Sélectionner la valeur de partition basée sur le nombre de chiffres du préfixe entreprise à partir du tableau des valeurs de partition.
  3. Étape 3 : Convertir la valeur de filtre, la valeur de partition, le préfixe entreprise, la référence article et le numéro de série en valeur binaire.
  4. Étape 4 : Concaténer dans l'ordre les valeurs binaires de l'en-tête, du filtre, de la partition, du préfixe entreprise, de la référence article et du numéro de série pour former l'EPC binaire.

Guide de référence SGTIN-96

ValeurDescription
0Tous les autres
Utilisé pour les articles qui ne correspondent pas aux autres catégories. Rarement utilisé dans la vente au détail en général.
1Article commercial au point de vente
L'unité de consommation standard vendue au point de vente. Exemple : Une bouteille de shampooing.
2Colis complet pour transport
Une unité d'expédition standard contenant plusieurs articles. Exemple : Un carton de 12 bouteilles de shampooing. Critique pour la logistique pour distinguer « une caisse » de « un article ».
3Réservé
Réservé pour une utilisation future.
4Regroupement d'articles internes
Un regroupement plus petit qu'une caisse complète, souvent pour l'affichage ou la manipulation en rayon. Exemple : Un lot de 3 sous film rétractable à l'intérieur de la caisse principale.
5Réservé
Réservé pour une utilisation future.
6Unité de charge
Une grande unité logistique, typiquement une palette contenant plusieurs caisses.
7Composant dans une unité de consommation
Une pièce spécifique à l'intérieur d'une unité de consommation. Exemple : Le couvercle de la batterie à l'intérieur d'un jouet.
ValeurPréfixe entrepriseRéférence article
040 Bits / 12 Chiffres4 Bits / 1 Chiffres
137 Bits / 11 Chiffres7 Bits / 2 Chiffres
234 Bits / 10 Chiffres10 Bits / 3 Chiffres
330 Bits / 9 Chiffres14 Bits / 4 Chiffres
427 Bits / 8 Chiffres17 Bits / 5 Chiffres
524 Bits / 7 Chiffres20 Bits / 6 Chiffres
620 Bits / 6 Chiffres24 Bits / 7 Chiffres

FAQ SGTIN-96

  • Elle indique au système le niveau d'emballage du tag. Si un système lit un tag « Caisse » (Filtre 2), il sait qu'il contient plusieurs articles. Cela évite le double comptage (ex. : compter une caisse comme une seule unité) et permet la vérification d'expédition valide.
  • Caisse (Filtre 2) est l'unité d'expédition principale utilisée pour le transport. Emballage interne (Filtre 4) est une subdivision à l'intérieur de cette caisse, généralement pour une manipulation ou un affichage plus facile (comme un lot de 6 à l'intérieur d'une caisse de 24). Les systèmes logistiques suivent les caisses ; Les opérations en magasin peuvent gérer efficacement les emballages internes.
  • Le décodage échouera ou produira le mauvais code-barres. La Partition détermine exactement où se termine le préfixe entreprise et où commence la référence article. Si ce « point de séparation » est incorrect, vous obtiendrez un code entreprise différent de celui prévu.
  • Le GTIN standard (code-barres) identifie uniquement le type de produit (ex. : « Soda 33 cl »). SGTIN-96 ajoute un numéro de série, donnant à chaque canette une identité unique. Cela permet la traçabilité au niveau article, vous permettant de suivre exactement quel article spécifique a été vendu, volé ou périmé.
  • Oui. Comme indiqué dans le convertisseur ci-dessus, la chaîne SGTIN-96 contient le GTIN-14 complet. En supprimant le numéro de série et les informations d'en-tête, vous pouvez parfaitement reconstruire le code-barres de vente au détail original.
  • L'en-tête (0x30) est un préfixe standard de 8 bits défini par GS1. Il indique simplement à n'importe quel lecteur RFID : « Ce tag est encodé selon la norme SGTIN-96. » D'autres en-têtes existent pour différentes normes (comme SSCC pour les palettes ou GIAI pour les actifs).