Engineering tools · EPC · GS1

Conversor de Código RFID

Ferramenta de conversão entre SGTIN-96 (Hexadecimal RFID) e Código de Barras (GTIN) + Número de Série. Compatível com leitores RFID padrão como Zebra, Chainway, Impinj, Nextwaves. Baseado em GS1 EPC Tag Data Standard.

Conversor RFID

Converta entre RFID Hex (SGTIN-96) e Código de Barras GS1 (GTIN) + Número de Série.

Scheme:SGTIN-9696 bits / Header 0x30

Lógica do Código e Passo a Passo

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

Código do Desenvolvedor

Use esta lógica de utilidade em seu projeto. Selecione um idioma abaixo.

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}

Explicar

SGTIN-96 é uma string binária de 96 bits dividida em 6 partes:

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
Cabeçalho (8 bits)Bits 0-8 (8)
001100000x30

Prefixo padrão (00110000) que identifica isso como SGTIN-96.

Filtro (3 bits)Bits 8-11 (3)
0113

Tipo de objeto (por exemplo, 1 = Varejo). Consulte o Guia de Referência abaixo.

Partição (3 bits)Bits 11-14 (3)
1015

Partição 5 significa: Código da Empresa usa 24 bits, Código do Produto usa 20 bits.

Prefixo da EmpresaBits 14-38 (24)
1000100001010111110000118935363

Código único da empresa atribuído pela GS1.

Referência do ItemBits 38-58 (20)
00010111011001011101095837

Seu código de produto específico.

Número de Série (38 bits)Bits 58-96 (38)
000000000000000000000000000000000000011

Identificador único para cada produto físico específico.

Visualizando a relação entre seu código de barras físico e o código eletrônico do produto (EPC).

Diagrama mostrando a conexão entre Código de Barras (GTIN) e URI SGTIN-96
  1. Passo 1: Determine o valor do cabeçalho binário para o esquema EPC. O valor do cabeçalho binário para SGTIN-96 é “00110000.”
  2. Passo 2: Selecione o Valor da Partição com base no número de dígitos no Prefixo da Empresa da Tabela de Valor da Partição.
  3. Passo 3: Converta o Valor do Filtro, Valor da Partição, Prefixo da Empresa, Referência do Item e Número de Série para valor binário.
  4. Passo 4: Concatene em ordem os valores binários do Cabeçalho, Filtro, Partição, Prefixo da Empresa, Referência do Item e Número de Série para formar o EPC Binário.

Guia de Referência SGTIN-96

ValorDescrição
0Todos os Outros
Usado para itens que não se encaixam em outras categorias. Raramente usado no varejo em geral.
1Item Comercial de Ponto de Venda (PDV)
A unidade de consumo padrão vendida no Ponto de Venda. Exemplo: Uma única garrafa de shampoo.
2Caixa Completa para Transporte
Uma unidade de envio padrão contendo vários itens. Exemplo: Uma caixa de 12 garrafas de shampoo. Crítico para a logística distinguir 'uma caixa' de 'um item'.
3Reservado
Reservado para uso futuro.
4Agrupamento de Item Comercial de Embalagem Interna
Um agrupamento menor que uma caixa completa, geralmente para exibição ou manuseio na prateleira. Exemplo: Um pacote de 3 unidades embalado em filme retrátil dentro da caixa principal.
5Reservado
Reservado para uso futuro.
6Carga Unitária
Uma grande unidade logística, normalmente um palete contendo várias caixas.
7Componente dentro da Unidade do Consumidor
Uma peça específica dentro de uma unidade do consumidor. Exemplo: A tampa da bateria dentro de um brinquedo.
ValorPrefixo da EmpresaReferência do Item
040 Bits / 12 Dígitos4 Bits / 1 Dígitos
137 Bits / 11 Dígitos7 Bits / 2 Dígitos
234 Bits / 10 Dígitos10 Bits / 3 Dígitos
330 Bits / 9 Dígitos14 Bits / 4 Dígitos
427 Bits / 8 Dígitos17 Bits / 5 Dígitos
524 Bits / 7 Dígitos20 Bits / 6 Dígitos
620 Bits / 6 Dígitos24 Bits / 7 Dígitos

Perguntas Frequentes sobre SGTIN-96

  • Ele informa ao sistema o nível de embalagem da tag. Se um sistema lê uma tag 'Case' (Filtro 2), ele sabe que contém vários itens. Isso evita a contagem dupla (por exemplo, contar um case como apenas uma única unidade) e permite a verificação de envio válida.
  • Case (Filtro 2) é a principal unidade de envio usada para transporte. Inner Pack (Filtro 4) é uma subdivisão dentro desse case, geralmente para facilitar o manuseio ou exibição (como um pacote de 6 dentro de um case de 24 latas). Os sistemas de logística rastreiam Cases; as operações da loja podem lidar com Inner Packs de forma eficiente.
  • A decodificação falhará ou produzirá o código de barras errado. A Partição determina exatamente onde o Prefixo da Empresa termina e a Referência do Item começa. Se este 'ponto de divisão' estiver errado, você obterá um Código da Empresa diferente do pretendido.
  • O GTIN padrão (Código de Barras) identifica apenas o tipo de produto (por exemplo, 'Refrigerante 350ml'). SGTIN-96 adiciona um Número de Série, dando a cada lata uma identidade única. Isso permite a rastreabilidade no nível do item, permitindo que você rastreie exatamente qual item específico foi vendido, roubado ou expirou.
  • Sim. Como mostrado no conversor acima, a string SGTIN-96 contém o GTIN-14 completo. Ao remover o Número de Série e as informações do cabeçalho, você pode reconstruir perfeitamente o código de barras original do varejo.
  • O Cabeçalho (0x30) é um prefixo padrão de 8 bits definido pela GS1. Ele simplesmente diz a qualquer leitor RFID: "Esta tag é codificada usando o padrão SGTIN-96." Outros cabeçalhos existem para diferentes padrões (como SSCC para paletes ou GIAI para ativos).