Engineering tools · EPC · GS1

RFID 코드 변환기

SGTIN-96 (RFID Hex)과 바코드 (GTIN) + 일련 번호 간의 변환 도구입니다. Zebra, Chainway, Impinj, Nextwaves와 같은 표준 RFID 리더와 호환됩니다. 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은 6개의 부분으로 나뉜 96비트 이진 문자열입니다.

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
헤더 (8 비트)Bits 0-8 (8)
001100000x30

SGTIN-96으로 식별하는 표준 접두사 (00110000).

필터(3비트)Bits 8-11 (3)
0113

객체 유형(예: 1 = 소매 소매). 아래 참조 가이드를 참조하십시오.

파티션 (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)와 SGTIN-96 URI 간의 연결을 보여주는 다이어그램
  1. 1단계: EPC 스키마에 대한 바이너리 헤더 값을 결정합니다. SGTIN-96의 바이너리 헤더 값은 “00110000”입니다.
  2. 2단계: 파티션 값 테이블에서 회사 접두사의 자릿수를 기준으로 파티션 값을 선택합니다.
  3. 3단계: 필터 값, 파티션 값, 회사 접두사, 품목 참조 및 일련 번호를 바이너리 값으로 변환합니다.
  4. 4단계: 헤더, 필터, 파티션, 회사 접두사, 품목 참조 및 일련 번호 바이너리 값을 순서대로 연결하여 바이너리 EPC를 형성합니다.

SGTIN-96 참조 가이드

설명
0기타 모든 항목
다른 범주에 맞지 않는 품목에 사용됩니다. 일반 소매에서는 거의 사용되지 않습니다.
1POS (Point of Sale) 거래 품목
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 자주 묻는 질문

  • 이는 시스템에 태그의 포장 수준을 알려줍니다. 시스템이 '케이스' 태그(필터 2)를 읽으면 여러 항목이 포함되어 있음을 알 수 있습니다. 이렇게 하면 이중 계산을 방지하고(예: 케이스를 단일 단위로 계산) 유효한 배송 확인을 허용합니다.
  • 케이스(필터 2)는 운송에 사용되는 기본 배송 단위입니다. 내부 팩(필터 4)은 해당 케이스 내부의 하위 부서로, 일반적으로 취급 또는 표시를 용이하게 하기 위한 것입니다(예: 24캔 케이스 내부의 6팩). 물류 시스템은 케이스를 추적하고, 매장 운영은 내부 팩을 효율적으로 처리할 수 있습니다.
  • 디코딩이 실패하거나 잘못된 바코드를 생성합니다. 파티션은 회사 접두사가 정확히 어디에서 끝나고 항목 참조가 시작되는지 결정합니다. 이 '분할 지점'이 잘못되면 의도한 것과 다른 회사 코드를 얻게 됩니다.
  • 표준 GTIN(바코드)은 제품 유형만 식별합니다(예: '12oz 소다'). SGTIN-96은 일련 번호를 추가하여 모든 단일 캔에 고유한 ID를 제공합니다. 이를 통해 항목 수준 추적성을 확보하여 판매, 도난 또는 만료된 특정 항목을 정확히 추적할 수 있습니다.
  • 예. 위의 변환기에서와 같이 SGTIN-96 문자열에는 완전한 GTIN-14가 포함되어 있습니다. 일련 번호와 헤더 정보를 제거하면 원래 소매 바코드를 완벽하게 재구성할 수 있습니다.
  • 헤더(0x30)는 GS1에서 정의한 표준 8비트 접두사입니다. 이는 단순히 모든 RFID 리더에게 다음과 같이 알려줍니다. "이 태그는 SGTIN-96 표준을 사용하여 인코딩되었습니다." 다른 표준(예: 팔레트의 SSCC 또는 자산의 GIAI)에 대한 다른 헤더가 있습니다.