diff --git a/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs b/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs index ff004a5..b8eba89 100644 --- a/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs +++ b/src/JT809.Protocol.Test/JT809Extensions/JT809BinaryExtensionsTest.cs @@ -13,7 +13,7 @@ namespace JT809.Protocol.Test.JT809Extensions public void Test1() { string vno = "粤A12345"; - byte[] bytes = JT809BinaryExtensions.encoding.GetBytes(vno); + byte[] bytes = JT809GlobalConfig.Instance.Encoding.GetBytes(vno); Assert.Equal(7,vno.Length); Assert.Equal(8, bytes.Length); } diff --git a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs index 1edb330..d031824 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809BinaryExtensions.cs @@ -199,7 +199,7 @@ namespace JT809.Protocol.JT809Extensions public static IEnumerable ToBytes(this string data) { - return ToBytes(data, encoding); + return ToBytes(data, JT809GlobalConfig.Instance.Encoding); } public static IEnumerable ToBytes(this int data, int len) diff --git a/src/JT809.Protocol/JT809Extensions/JT809CRCExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809CRCExtensions.cs index c395814..7215789 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809CRCExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809CRCExtensions.cs @@ -18,7 +18,7 @@ namespace JT809.Protocol.JT809Extensions ushort checkCode = 0xFFFF; for (int j = offset; j < iLen; ++j) { - checkCode = (ushort)((checkCode << 8) ^ (ushort)CRC[(checkCode >> 8) ^ ucbuf[j]]); + checkCode = (ushort)((checkCode << 8) ^ (ushort)JT809GlobalConfig.Instance.CRC[(checkCode >> 8) ^ ucbuf[j]]); } return checkCode; } @@ -35,7 +35,7 @@ namespace JT809.Protocol.JT809Extensions ushort checkCode = 0xFFFF; for (int j = offset; j < iLen; ++j) { - checkCode = (ushort)((checkCode << 8) ^ (ushort)CRC[(checkCode >> 8) ^ ucbuf[j]]); + checkCode = (ushort)((checkCode << 8) ^ (ushort)JT809GlobalConfig.Instance.CRC[(checkCode >> 8) ^ ucbuf[j]]); } return checkCode; } diff --git a/src/JT809.Protocol/JT809Extensions/JT809InitBinaryExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809InitBinaryExtensions.cs deleted file mode 100644 index 74a64fa..0000000 --- a/src/JT809.Protocol/JT809Extensions/JT809InitBinaryExtensions.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace JT809.Protocol.JT809Extensions -{ - public static partial class JT809BinaryExtensions - { - public static Encoding encoding; - - private const ushort cnCRC_CCITT = 0x1021; //CRC校验多项式 - - private static ulong[] CRC = new ulong[256]; //建立CRC16表 - - static JT809BinaryExtensions() - { - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - encoding = Encoding.GetEncoding("GBK"); - ushort i, j; - ushort nData; - ushort nAccum; - for (i = 0; i < 256; i++) - { - nData = (ushort)(i << 8); - nAccum = 0; - for (j = 0; j < 8; j++) - { - if (((nData ^ nAccum) & 0x8000) > 0) - nAccum = (ushort)((nAccum << 1) ^ cnCRC_CCITT); - else - nAccum <<= 1; - nData <<= 1; - } - CRC[i] = (ulong)nAccum; - } - } - } -} diff --git a/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs b/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs index 693c0ba..31877c2 100644 --- a/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs +++ b/src/JT809.Protocol/JT809Extensions/JT809StringExtensions.cs @@ -11,21 +11,21 @@ namespace JT809.Protocol.JT809Extensions { public static string ReadStringLittle(ReadOnlySpan read, ref int offset, int len) { - string value = encoding.GetString(read.Slice(offset, len).ToArray()); + string value = JT809GlobalConfig.Instance.Encoding.GetString(read.Slice(offset, len).ToArray()); offset += len; return value.Trim('\0'); } public static string ReadStringLittle(ReadOnlySpan read, ref int offset) { - string value = encoding.GetString(read.Slice(offset).ToArray()); + string value = JT809GlobalConfig.Instance.Encoding.GetString(read.Slice(offset).ToArray()); offset += value.Length; return value.Trim('\0'); } public static int WriteStringLittle(byte[] bytes, int offset, string data) { - byte[] codeBytes = encoding.GetBytes(data); + byte[] codeBytes = JT809GlobalConfig.Instance.Encoding.GetBytes(data); Array.Copy(codeBytes, 0, bytes, offset, codeBytes.Length); return codeBytes.Length; } @@ -39,7 +39,7 @@ namespace JT809.Protocol.JT809Extensions } else { - tempBytes = encoding.GetBytes(data); + tempBytes = JT809GlobalConfig.Instance.Encoding.GetBytes(data); } byte[] rBytes = new byte[len]; for (int i = 0; i < tempBytes.Length; i++) @@ -54,7 +54,7 @@ namespace JT809.Protocol.JT809Extensions public static int WriteStringPadLeftLittle(byte[] bytes, int offset, string data, int len) { data = data.PadLeft(len, '\0'); - byte[] codeBytes = encoding.GetBytes(data); + byte[] codeBytes = JT809GlobalConfig.Instance.Encoding.GetBytes(data); Array.Copy(codeBytes, 0, bytes, offset, codeBytes.Length); return codeBytes.Length; } @@ -62,7 +62,7 @@ namespace JT809.Protocol.JT809Extensions public static int WriteStringPadRightLittle(byte[] bytes, int offset, string data, int len) { data = data.PadRight(len, '\0'); - byte[] codeBytes = encoding.GetBytes(data); + byte[] codeBytes = JT809GlobalConfig.Instance.Encoding.GetBytes(data); Array.Copy(codeBytes, 0, bytes, offset, codeBytes.Length); return codeBytes.Length; } diff --git a/src/JT809.Protocol/JT809GlobalConfig.cs b/src/JT809.Protocol/JT809GlobalConfig.cs index ea7e2fc..df3fb0d 100644 --- a/src/JT809.Protocol/JT809GlobalConfig.cs +++ b/src/JT809.Protocol/JT809GlobalConfig.cs @@ -13,11 +13,16 @@ namespace JT809.Protocol private JT809GlobalConfig() { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + Encoding = Encoding.GetEncoding("GBK"); MsgSNDistributed = new DefaultMsgSNDistributedImpl(); HeaderOptions = new JT809HeaderOptions(); SkipCRCCode = false; + initCrcTable(); } + public Encoding Encoding; + public static JT809GlobalConfig Instance { get @@ -92,5 +97,31 @@ namespace JT809.Protocol instance.Value.SkipCRCCode = skipCRCCode; return instance.Value; } + + private const ushort cnCRC_CCITT = 0x1021; //CRC校验多项式 + + public ulong[] CRC; //建立CRC16表 + + private void initCrcTable() + { + CRC = new ulong[256]; + ushort i, j; + ushort nData; + ushort nAccum; + for (i = 0; i < 256; i++) + { + nData = (ushort)(i << 8); + nAccum = 0; + for (j = 0; j < 8; j++) + { + if (((nData ^ nAccum) & 0x8000) > 0) + nAccum = (ushort)((nAccum << 1) ^ cnCRC_CCITT); + else + nAccum <<= 1; + nData <<= 1; + } + CRC[i] = (ulong)nAccum; + } + } } }