Laden...

VDA5520 VIN Komprimierung/Encoding + EPC Memory Generator nach ISO/IEC 18000-6 (Type C)

Erstellt von nxexoxn vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.097 Views
N
nxexoxn Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren
VDA5520 VIN Komprimierung/Encoding + EPC Memory Generator nach ISO/IEC 18000-6 (Type C)

Beschreibung:

Encode/Decode VIN (Vehicle Identification Number) nach VDA5520.

.NET DLL-Bibliothek zum Komprimieren einer 17-stelligen VIN (Vehicle Identification Number) in eine 13-Byte Hex-formatierte VIN samt Protocol Control Bit.
Dieser Hex-formatierte Wert kann in den EPC-Memory eines UHF- Transponders über einen RFID-Reader geschrieben werden.

Beispiel encoding:
VIN.GenerateEpcMemoryData("ABCDEFGH123456789");
Ergebnis:
4D030A4F510D0420C41461C8C72CF4D76DF8E600

Beispiel decoding:
VIN.GetVinFromEpcMemoryData("4D030A4F510D0420C41461C8C72CF4D76DF8E600");
Ergebnis:
ABCDEFGH123456789


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VDA5520
{
    public static class VIN
    {
        public static string GenerateEpcMemoryData(string VIN)
        {
            //string ProtocolControl = "4903";  // Without optional user memory
            string ProtocolControl = "4D03";    // With optional user memory
            string DSFID = "0A";
            string PrecursorVin = "4F";
            string RelativeOid = "51";
            string LengthVin = "0D";
            string Encoded6BitVin = Encode6BitVin(VIN);

            return ProtocolControl + DSFID + PrecursorVin + RelativeOid + LengthVin + Encoded6BitVin;
        }

        public static string GetVinFromEpcMemoryData(string EpcMemoryData)
        {
            string CompressedSixBitVin = EpcMemoryData.Substring(12);

            return Decode6BitVin(CompressedSixBitVin);
        }

        private static string Encode6BitVin(string VIN)
        {
            try
            {
                if (VIN != string.Empty)
                {
                    StringBuilder SixBitVin = new StringBuilder();

                    // Binary 6 Bit
                    for (int i = 0; i < VIN.Length; i++)
                    {
                        string SixBit = Convert.ToString(VIN[i], 2).PadLeft(8, '0');
                        SixBit = SixBit.Substring(2, 6);
                        SixBitVin.Append(SixBit);
                    }

                    // Fill with "10" Padright (at the end)
                    SixBitVin.Append("10");

                    // Bin to hexstring output
                    return BinToHex(SixBitVin.ToString()) + "00";       // Add terminator for last byte
                }
                else
                    return string.Empty;
            }
            catch
            {
                return string.Empty;
            }
        }

        private static string Decode6BitVin(string CompressedSixBitVin)
        {
            try
            {
                string SixBitVin = HexToBin(CompressedSixBitVin);
                StringBuilder UncompressedVin = new StringBuilder();

                // Generate SixBitVinDataTable ASCII: 40 - 93
                Dictionary<string, string> SixBitVinDataTable = new Dictionary<string, string>();
                for (int i = 40; i <= 93; i++)
                {
                    string SixBitBin = HexToBin(i.ToString("X2")).Substring(2);
                    string Ascii = ((char)i).ToString();

                    SixBitVinDataTable.Add(SixBitBin, Ascii);
                }

                // Split SixBitVin into six blocks and lookup for character in SixBitVinDataTable
                for (int i = 0; i < SixBitVin.Length - 6; i += 6)
                {
                    string Value;
                    SixBitVinDataTable.TryGetValue(SixBitVin.Substring(i, 6), out Value);
                    UncompressedVin.Append(Value);
                }

                return UncompressedVin.ToString();
            }
            catch
            {
                return string.Empty;
            }
        }

        private static string BinToHex(string bin)
        {
            StringBuilder Out = new StringBuilder();

            for (int i = 0; i <= bin.Length - 4; i += 4)
                Out.Append(string.Format("{0:X}", Convert.ToByte(bin.Substring(i, 4), 2)));

            return Out.ToString();
        }

        private static string HexToBin(string hexvalue)
        {
            string tmp = "";
            string bin = "";
            int zerofill = 0;
            for (int i = 0; i < hexvalue.Length; i++)
            {
                tmp = Convert.ToString(Convert.ToInt32(hexvalue.Substring(i, 1), 16), 2);
                zerofill = 4 - tmp.Length;
                for (int j = 0; j < zerofill; j++)
                    bin += "0";
                bin += tmp;
            }
            return bin;
        }
    }
}

Awendung:


VIN.GenerateEpcMemoryData("ABCDEFGH123456789");

VIN.GetVinFromEpcMemoryData("4D030A4F510D0420C41461C8C72CF4D76DF8E600");

Download:
http://nxexoxn.nx.ohost.de/site/vda5520.htm