Engineering tools · EPC · GS1
محول أكواد RFID
أداة تحويل بين SGTIN-96 (Hex RFID) والباركود (GTIN) + الرقم التسلسلي. متوافقة مع قارئات RFID القياسية مثل Zebra وChainway وImpinj وNextwaves. مبنية على معايير GS1 EPC Tag Data.
محول RFID
تحويل بين RFID Hex (SGTIN-96) وGS1 Barcode (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 | صنف تجارة نقطة البيع (POS) وحدة المستهلك القياسية المباعة عند نقطة البيع. مثال: زجاجة شامبو واحدة. |
| 2 | علبة كاملة للنقل وحدة شحن قياسية تحتوي على أصناف متعددة. مثال: كرتون 12 زجاجة شامبو. حاسم للخدمات اللوجستية للتمييز بين 'صندوق واحد' و'صنف واحد'. |
| 3 | محجوز محجوز للاستخدام المستقبلي. |
| 4 | تجميع صنف العبوة الداخلية تجميع أصغر من الصندوق الكامل، غالباً للعرض على الأرفف أو المناولة. مثال: حزمة 3 محكمة بالشلrink المغلقة داخل الكرتون الرئيسي. |
| 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)،他知道 contiene varios artículos. Esto previene el doble conteo (por ejemplo, contar una caja como una sola unidad) y permite la verificación de envío válida.
- الصندوق (فلتر 2) هو وحدة الشحن الأساسية المستخدمة للنقل. العبوة الداخلية (فلتر 4) هو تقسيم داخل هذا الصندوق، عادةً لتسهيل المناولة أو العرض (مثل حزمة 6 داخل صندوق 24 علبة). تتتبع أنظمة الخدمات اللوجستية الصناديق؛ قد تتعامل عمليات المتجر بكفاءة مع العبوات الداخلية.
- سيفشل فك الترميز أو ينتج باركود خاطئ. يحدد التقسيم بالضبط أين تنتهي بادئة الشركة وأين يبدأ مرجع الصنف. إذا كان "نقطة الانقسام" هذه خاطئة، ستحصل على رمز شركة مختلف عما هو مقصود.
- GTIN القياسي (الباركود) يحدد فقط نوع المنتج (مثل 'صودا 12 أونصة'). يضيف SGTIN-96 رقم تسلسلي، مما يمنح كل علبة هوية فريدة. يتيح هذا التتبع على مستوى الصنف، مما يسمح بتتبع أي صنف محدد تم بيعه أو سرقته أو انتهت صلاحيته.
- نعم. كما هو موضح في المحول أعلاه، تحتوي سلسلة SGTIN-96 على GTIN-14 الكامل. بإزالة الرقم التسلسلي ومعلومات الترويسة، يمكنك إعادة بناء باركود التجزئة الأصلي بدقة.
- الترويسة (0x30) هي بادئة قياسية 8-بت محددة من GS1. تخبر ببساطة أي قارئ RFID: "هذه البطاقة مشفرة باستخدام معيار SGTIN-96." توجد ترويسات أخرى لمعايير مختلفة (مثل SSCC للبالتات أو GIAI للأصول).