using System; using System.Text; using System.IO; using HH.WMS.Utils.NPOI.Util; using HH.WMS.Utils.NPOI.HSSF.Record; namespace HH.WMS.Utils.NPOI.HSSF.Util { public class GUID { /* * this class is currently only used here, but could be moved to a * common package if needed */ private static int TEXT_FORMAT_LENGTH = 36; public static int ENCODED_SIZE = 16; /** 4 bytes - little endian */ private int _d1; /** 2 bytes - little endian */ private int _d2; /** 2 bytes - little endian */ private int _d3; /** * 8 bytes - serialized as big endian, stored with inverted endianness here */ private long _d4; public GUID(ILittleEndianInput in1) :this(in1.ReadInt(), in1.ReadUShort(), in1.ReadUShort(), in1.ReadLong()) { } public GUID(int d1, int d2, int d3, long d4) { _d1 = d1; _d2 = d2; _d3 = d3; _d4 = d4; } public void Serialize(ILittleEndianOutput out1) { out1.WriteInt(_d1); out1.WriteShort(_d2); out1.WriteShort(_d3); out1.WriteLong(_d4); } public override bool Equals(Object obj) { GUID other = (GUID) obj; return _d1 == other._d1 && _d2 == other._d2 && _d3 == other._d3 && _d4 == other._d4; } public override int GetHashCode () { return _d1 ^ _d2 ^ _d3 ^ _d4.GetHashCode (); } public int D1 { get{ return _d1; } } public int D2 { get{ return _d2; } } public int D3 { get{ return _d3; } } public long D4 { get{ //return _d4; byte[] buf; using (MemoryStream ms = new MemoryStream(8)) { BinaryWriter bw = new BinaryWriter(ms); bw.Write(_d4); buf = ms.ToArray(); bw.Close(); } Array.Reverse(buf); return new LittleEndianByteArrayInputStream(buf).ReadLong(); } } public String FormatAsString() { StringBuilder sb = new StringBuilder(36); int PREFIX_LEN = "0x".Length; sb.Append(HexDump.IntToHex(_d1), PREFIX_LEN, 8); sb.Append("-"); sb.Append(HexDump.ShortToHex(_d2), PREFIX_LEN, 4); sb.Append("-"); sb.Append(HexDump.ShortToHex(_d3), PREFIX_LEN, 4); sb.Append("-"); char[] d4Chars = HexDump.LongToHex(D4); sb.Append(d4Chars, PREFIX_LEN, 4); sb.Append("-"); sb.Append(d4Chars, PREFIX_LEN + 4, 12); return sb.ToString(); } public override String ToString() { StringBuilder sb = new StringBuilder(64); sb.Append(GetType().Name).Append(" ["); sb.Append(FormatAsString()); sb.Append("]"); return sb.ToString(); } /** * Read a GUID in standard text form e.g.
* 13579BDF-0246-8ACE-0123-456789ABCDEF *
->
* 0x13579BDF, 0x0246, 0x8ACE 0x0123456789ABCDEF */ public static GUID Parse(String rep) { char[] cc = rep.ToCharArray(); if (cc.Length != TEXT_FORMAT_LENGTH) { throw new RecordFormatException("supplied text is the wrong length for a GUID"); } int d0 = (ParseShort(cc, 0) << 16) + (ParseShort(cc, 4) << 0); int d1 = ParseShort(cc, 9); int d2 = ParseShort(cc, 14); for (int i = 23; i > 19; i--) { cc[i] = cc[i - 1]; } long d3 = ParseLELong(cc, 20); return new GUID(d0, d1, d2, d3); } private static long ParseLELong(char[] cc, int startIndex) { long acc = 0; for (int i = startIndex + 14; i >= startIndex; i -= 2) { acc <<= 4; acc += ParseHexChar(cc[i + 0]); acc <<= 4; acc += ParseHexChar(cc[i + 1]); } return acc; } private static int ParseShort(char[] cc, int startIndex) { int acc = 0; for (int i = 0; i < 4; i++) { acc <<= 4; acc += ParseHexChar(cc[startIndex + i]); } return acc; } private static int ParseHexChar(char c) { if (c >= '0' && c <= '9') { return c - '0'; } if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } throw new RecordFormatException("Bad hex char '" + c + "'"); } } }