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");