Engineering tools · EPC · GS1
مبدل کد RFID
ابزار تبدیل بین SGTIN-96 (Hex RFID) و بارکد (GTIN) + شماره سریال. سازگار با خوانندههای RFID استاندارد مانند Zebra، Chainway، Impinj، Nextwaves. بر اساس استاندارد داده برچسب GS1 EPC.
مبدل RFID
تبدیل بین Hex RFID (SGTIN-96) و بارکد GS1 (GTIN) + شماره سریال.
Scheme:SGTIN-9696 bits / Header 0x30
EPC URIs
منطق کد و گام به گام
// 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 = کالای خردهفروشی). به راهنمای مرجع زیر مراجعه کنید.
پارتیشن (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شناسه منحصربهفرد برای هر محصول فیزیکی خاص.
درک SGTIN و GTIN
تجسم رابطه بین بارکد فیزیکی شما و کد محصول الکترونیکی (EPC).

منطق کدگذاری (گام به گام)
- گام 1: مقدار هدر باینری را برای طرح EPC تعیین کنید. مقدار هدر باینری برای SGTIN-96 "00110000" است.
- گام 2: مقدار پارتیشن را بر اساس تعداد ارقام در پیشوند شرکت از جدول مقدار پارتیشن انتخاب کنید.
- گام 3: مقدار فیلتر، مقدار پارتیشن، پیشوند شرکت، ارجاع اقلام و شماره سریال را به مقدار باینری تبدیل کنید.
- گام 4: مقادیر باینری هدر، فیلتر، پارتیشن، پیشوند شرکت، ارجاع اقلام و شماره سریال را به ترتیب الحاق کنید تا EPC باینری تشکیل شود.
راهنمای مرجع SGTIN-96
| مقدار | توضیح |
|---|---|
| 0 | همه موارد دیگر برای اقلامی که در دستههای دیگر قرار نمیگیرند استفاده میشود. به ندرت در خردهفروشی عمومی استفاده میشود. |
| 1 | کالای فروشگاهی نقطه فروش واحد مصرفی استاندارد فروخته شده در نقطه فروش. مثال: یک بطری شامپو. |
| 2 | جعبه کامل برای حمل واحد حمل استاندارد حاوی چندین قلم. مثال: یک کارتن 12 بطری شامپو. برای لجستیک برای تمایز بین 'یک جعبه' و 'یک قلم' حیاتی است. |
| 3 | رزرو شده برای استفاده آینده رزرو شده. |
| 4 | گروهبندی بسته داخلی گروهبندی کوچکتر از یک جعبه کامل، اغلب برای نمایش قفسه یا جابجایی. مثال: بسته 3 تایی شرینپیچ شده در داخل کارتن اصلی. |
| 5 | رزرو شده برای استفاده آینده رزرو شده. |
| 6 | بار واحدی واحد لجستیکی بزرگ، معمولاً یک پالت حاوی چندین جعبه. |
| 7 | قطعه داخل واحد مصرفکننده یک قطعه خاص داخل واحد مصرفکننده. مثال: درب باتری داخل یک اسباببازی. |
| مقدار | پیشوند شرکت | ارجاع اقلام |
|---|---|---|
| 0 | 40 بیت / 12 رقم | 4 بیت / 1 رقم |
| 1 | 37 بیت / 11 رقم | 7 بیت / 2 رقم |
| 2 | 34 بیت / 10 رقم | 10 بیت / 3 رقم |
| 3 | 30 بیت / 9 رقم | 14 بیت / 4 رقم |
| 4 | 27 بیت / 8 رقم | 17 بیت / 5 رقم |
| 5 | 24 بیت / 7 رقم | 20 بیت / 6 رقم |
| 6 | 20 بیت / 6 رقم | 24 بیت / 7 رقم |
سؤالات متداول SGTIN-96
- به سیستم میگوید که سطح بستهبندی برچسب چیست. اگر سیستم یک برچسب 'جعبه' (فیلتر 2) بخواند، میداند که حاوی چندین قلم است. این از شمارش مضاعف جلوگیری میکند (مثلاً شمارش یک جعبه فقط به عنوان یک واحد) و امکان تأیید حمل معتبر را فراهم میکند.
- جعبه (فیلتر 2) واحد حمل اصلی برای حمل و نقل است. بسته داخلی (فیلتر 4) تقسیمی درون آن جعبه است، معمولاً برای جابجایی یا نمایش آسانتر (مثلاً بسته 6 تایی درون جعبه 24 تایی). سیستمهای لجستیک جعبهها را ردیابی میکنند؛ عملیات فروشگاه ممکن است بستههای داخلی را کارآمدتر مدیریت کنند.
- رمزگشایی ناموفق میشود یا بارکد اشتباه تولید میکند. پارتیشن دقیقاً تعیین میکند که پیشوند شرکت کجا تمام میشود و ارجاع اقلام从哪里 شروع میشود. اگر این 'نقطه تقسیم' اشتباه باشد، کد شرکت متفاوتی از آنچه در نظر داشتید دریافت خواهید کرد.
- GTIN استاندارد (بارکد) فقط نوع محصول را شناسایی میکند (مثلاً 'نوشابه 12 اونس'). SGTIN-96 یک شماره سریال اضافه میکند و به هر قوطی یک هویت منحصربهفرد میدهد. این امکان ردیابی سطح اقلام را فراهم میکند و به شما امکان میدهد دقیقاً ردیابی کنید کدام قلم خاص فروخته شد، دزدیده شد یا منقضی شد.
- بله. همانطور که در مبدل بالا نشان داده شده، رشته SGTIN-96 شامل GTIN-14 کامل است. با حذف شماره سریال و اطلاعات هدر، میتوانید بارکد خردهفروشی اصلی را کاملاً بازسازی کنید.
- هدر (0x30) یک پیشوند استاندارد 8 بیتی است که توسط GS1 تعریف شده است. به سادگی به هر خواننده RFID میگوید: "این برچسب با استاندارد SGTIN-96 کدگذاری شده است." هدرهای دیگری برای استانداردهای مختلف وجود دارند (مانند SSCC برای پالتها یا GIAI برای داراییها).