Optimizations, modernizations, cleanup

This commit is contained in:
2019-02-22 11:04:41 -06:00
parent ffb891b04b
commit 4ecdacedab
13 changed files with 121 additions and 111 deletions

View File

@ -14,17 +14,21 @@ namespace ScreenLogicConnect
{ {
var arr = msg.AsByteArray(); var arr = msg.AsByteArray();
System.Diagnostics.Debug.WriteLine($" sent {arr.Length}"); System.Diagnostics.Debug.WriteLine($" sent {arr.Length}");
stream.Write(arr, 0, arr.Length); stream.Write(arr);
} }
public static void WritePrefixLength(this BinaryWriter bw, string val) public static void WritePrefixLength(this BinaryWriter bw, string val)
{ {
bw.Write(val.Length); bw.Write(val.Length);
bw.Write(Encoding.ASCII.GetBytes(val)); bw.Write(Encoding.ASCII.GetBytes(val));
bw.Write(new byte[HLMessageTypeHelper.AlignToNext4Boundary(val.Length)]); var boundaryBufferLen = HLMessageTypeHelper.AlignToNext4Boundary(val.Length);
for (int i = 0; i < boundaryBufferLen; i++)
{
bw.Write((byte)0);
}
} }
public static void WritePrefixLength(this BinaryWriter bw, byte[] val) public static void WritePrefixLength(this BinaryWriter bw, ReadOnlySpan<byte> val)
{ {
bw.Write(val.Length); bw.Write(val.Length);
bw.Write(val); bw.Write(val);

View File

@ -1,4 +1,6 @@
namespace ScreenLogicConnect using System;
namespace ScreenLogicConnect
{ {
public class HLEncoder public class HLEncoder
{ {
@ -17,7 +19,7 @@
private readonly uint[] sm_U2 = new uint[] { 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 }; private readonly uint[] sm_U2 = new uint[] { 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 };
private readonly uint[] sm_U3 = new uint[] { 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 }; private readonly uint[] sm_U3 = new uint[] { 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 };
private readonly uint[] sm_U4 = new uint[] { 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d }; private readonly uint[] sm_U4 = new uint[] { 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d };
private readonly byte[] sm_rcon = new byte[] { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; private readonly byte[] sm_rcon = new byte[] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 };
readonly uint[] tk = new uint[MAX_KC]; readonly uint[] tk = new uint[MAX_KC];
private bool bKeyInit; private bool bKeyInit;
@ -31,7 +33,7 @@
} }
} }
public byte[] GetEncryptedPassword(string cls) public Span<byte> GetEncryptedPassword(string cls)
{ {
if (!string.IsNullOrEmpty(cls)) if (!string.IsNullOrEmpty(cls))
{ {
@ -41,14 +43,14 @@
return null; return null;
} }
private byte[] MakeBlock(string str, byte byFill) private Span<byte> MakeBlock(string str, byte byFill)
{ {
int iLen = BLOCK_SIZE; int iLen = BLOCK_SIZE;
if (str.Length >= BLOCK_SIZE) if (str.Length >= BLOCK_SIZE)
{ {
iLen = str.Length; iLen = str.Length;
} }
byte[] block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)]; var block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
for (int i = 0; i < block.Length; i++) for (int i = 0; i < block.Length; i++)
{ {
if (i < str.Length) if (i < str.Length)
@ -63,14 +65,14 @@
return block; return block;
} }
private byte[] MakeBlock(byte[] source, byte byFill) private Span<byte> MakeBlock(ReadOnlySpan<byte> source, byte byFill)
{ {
int iLen = BLOCK_SIZE; int iLen = BLOCK_SIZE;
if (source.Length >= BLOCK_SIZE) if (source.Length >= BLOCK_SIZE)
{ {
iLen = source.Length; iLen = source.Length;
} }
byte[] block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)]; var block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
for (int i = 0; i < block.Length; i++) for (int i = 0; i < block.Length; i++)
{ {
if (i < source.Length) if (i < source.Length)
@ -90,7 +92,7 @@
MakeKeyFromBlock(MakeBlock(sChallengeStr, 0)); MakeKeyFromBlock(MakeBlock(sChallengeStr, 0));
} }
private void MakeKeyFromBlock(byte[] block) private void MakeKeyFromBlock(ReadOnlySpan<byte> block)
{ {
if (block == null) if (block == null)
{ {
@ -185,7 +187,7 @@
} }
} }
private byte[] EncryptBlock(byte[] block) private Span<byte> EncryptBlock(ReadOnlySpan<byte> block)
{ {
if (!bKeyInit) if (!bKeyInit)
{ {
@ -218,7 +220,7 @@
}; };
} }
byte[] Encrypt(string sString) Span<byte> Encrypt(string sString)
{ {
if (bKeyInit) if (bKeyInit)
{ {
@ -227,7 +229,7 @@
return null; return null;
} }
byte[] Encrypt(byte[] source) Span<byte> Encrypt(ReadOnlySpan<byte> source)
{ {
if (bKeyInit) if (bKeyInit)
{ {
@ -236,24 +238,19 @@
return null; return null;
} }
byte[] EncryptData(byte[] data) Span<byte> EncryptData(ReadOnlySpan<byte> data)
{ {
if (data == null || data.Length < BLOCK_SIZE || data.Length % BLOCK_SIZE != 0) if (data == null || data.Length < BLOCK_SIZE || data.Length % BLOCK_SIZE != 0)
{ {
return null; return null;
} }
byte[] byEncrypted = new byte[data.Length];
var byEncrypted = new byte[data.Length];
int iNBlocks = data.Length / BLOCK_SIZE; int iNBlocks = data.Length / BLOCK_SIZE;
for (int iBlock = 0; iBlock < iNBlocks; iBlock++) for (int iBlock = 0; iBlock < iNBlocks; iBlock++)
{ {
int i; var encryptedBlock = EncryptBlock(data.Slice(iBlock * BLOCK_SIZE, BLOCK_SIZE));
byte[] decryptedBlock = new byte[BLOCK_SIZE]; for (int i = 0; i < encryptedBlock.Length; i++)
for (i = 0; i < BLOCK_SIZE; i++)
{
decryptedBlock[i] = data[(iBlock * BLOCK_SIZE) + i];
}
byte[] encryptedBlock = EncryptBlock(decryptedBlock);
for (i = 0; i < encryptedBlock.Length; i++)
{ {
byEncrypted[(iBlock * BLOCK_SIZE) + i] = encryptedBlock[i]; byEncrypted[(iBlock * BLOCK_SIZE) + i] = encryptedBlock[i];
} }

View File

@ -36,26 +36,26 @@ namespace ScreenLogicConnect
} }
} }
public HLTime(short year, short month, short dayOfWeek, short day, short hour, short minute, short second, short millisecond) public HLTime(short inYear, short inMonth, short inDayOfWeek, short inDay, short inHour, short inMinute, short inSecond, short inMillisecond)
{ {
this.year = year; year = inYear;
this.month = month; month = inMonth;
this.dayOfWeek = dayOfWeek; dayOfWeek = inDayOfWeek;
this.day = day; day = inDay;
this.hour = hour; hour = inHour;
this.minute = minute; minute = inMinute;
this.second = second; second = inSecond;
this.millisecond = millisecond; millisecond = inMillisecond;
} }
public string toString() public string toString()
{ {
return "" + this.month + "/" + this.day + "/" + this.year; return "" + month + "/" + day + "/" + year;
} }
public DateTime toDate() public DateTime toDate()
{ {
return new DateTime(year: (this.year - 2000) + 100, month: month - 1, day: day, hour: hour, minute: minute, second: second); return new DateTime(year: (year - 2000) + 100, month: month - 1, day: day, hour: hour, minute: minute, second: second);
} }
public long toMilliseconds() public long toMilliseconds()

View File

@ -19,7 +19,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public ChallengeString(byte[] header, byte[] data) public ChallengeString(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data) : base(header, data)
{ {
} }
@ -31,13 +31,7 @@ namespace ScreenLogicConnect.Messages
protected override void Decode() protected override void Decode()
{ {
using (var ms = new MemoryStream(data)) ChallengeStr = HLMessageTypeHelper.ExtractString(data);
{
using (var br = new BinaryReader(dataByteStream))
{
ChallengeStr = HLMessageTypeHelper.ExtractString(br);
}
}
} }
} }
} }

View File

@ -5,7 +5,7 @@ namespace ScreenLogicConnect.Messages
{ {
public class ClientLogin : HLMessage public class ClientLogin : HLMessage
{ {
public byte[] m_byteArray; public byte[] m_password;
public int m_connectionType; public int m_connectionType;
public int m_int; public int m_int;
public int m_procID; public int m_procID;
@ -24,7 +24,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public override byte[] AsByteArray() public override Span<byte> AsByteArray()
{ {
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {
@ -33,7 +33,7 @@ namespace ScreenLogicConnect.Messages
bw.Write(m_schema); bw.Write(m_schema);
bw.Write(m_connectionType); bw.Write(m_connectionType);
bw.WritePrefixLength(m_version); bw.WritePrefixLength(m_version);
bw.WritePrefixLength(m_byteArray); bw.WritePrefixLength(m_password);
bw.Write(m_procID); bw.Write(m_procID);
} }

View File

@ -36,7 +36,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public GetControllerConfig(byte[] header, byte[] data) public GetControllerConfig(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data) : base(header, data)
{ {
} }
@ -46,7 +46,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public override byte[] AsByteArray() public override Span<byte> AsByteArray()
{ {
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {

View File

@ -35,7 +35,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public override byte[] AsByteArray() public override Span<byte> AsByteArray()
{ {
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {

View File

@ -1,4 +1,6 @@
namespace ScreenLogicConnect.Messages using System;
namespace ScreenLogicConnect.Messages
{ {
public class GetMode : HLMessage public class GetMode : HLMessage
{ {
@ -14,7 +16,7 @@
{ {
} }
public GetMode(byte[] header, byte[] data) public GetMode(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data) : base(header, data)
{ {
} }

View File

@ -1,4 +1,5 @@
using System.IO; using System;
using System.IO;
using System.Linq; using System.Linq;
namespace ScreenLogicConnect.Messages namespace ScreenLogicConnect.Messages
@ -40,7 +41,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public GetPoolStatus(byte[] header, byte[] data) public GetPoolStatus(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data) : base(header, data)
{ {
} }
@ -50,7 +51,7 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public override byte[] AsByteArray() public override Span<byte> AsByteArray()
{ {
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {
@ -124,27 +125,27 @@ namespace ScreenLogicConnect.Messages
public bool isDeviceready() public bool isDeviceready()
{ {
return this.m_Ok == 1; return m_Ok == 1;
} }
public bool isDeviceSync() public bool isDeviceSync()
{ {
return this.m_Ok == 2; return m_Ok == 2;
} }
public bool isDeviceServiceMode() public bool isDeviceServiceMode()
{ {
return this.m_Ok == 3; return m_Ok == 3;
} }
public bool isSpaActive() public bool isSpaActive()
{ {
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.SPA_CIRCUIT_ID && x.state == 1) ?? false; return circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.SPA_CIRCUIT_ID && x.state == 1) ?? false;
} }
public bool isPoolActive() public bool isPoolActive()
{ {
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.POOL_CIRCUIT_ID && x.state == 1) ?? false; return circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.POOL_CIRCUIT_ID && x.state == 1) ?? false;
} }
} }
} }

View File

@ -27,20 +27,23 @@ namespace ScreenLogicConnect.Messages
} }
} }
public HLMessage(byte[] headerArray, byte[] dataArray) public HLMessage(ReadOnlySpan<byte> headerArray, ReadOnlySpan<byte> dataArray)
{ {
if (headerArray != null) if (headerArray != null)
{ {
header = new byte[headerArray.Length]; header = new byte[headerArray.Length];
Array.Copy(headerArray, header, headerArray.Length); headerArray.CopyTo(header);
} }
if (dataArray != null) if (dataArray != null)
{ {
data = new byte[dataArray.Length]; data = new byte[dataArray.Length];
Array.Copy(dataArray, data, dataArray.Length); dataArray.CopyTo(data);
} }
Decode(); if (data != null)
{
Decode();
}
} }
public HLMessage(HLMessage msg) public HLMessage(HLMessage msg)
@ -48,26 +51,29 @@ namespace ScreenLogicConnect.Messages
{ {
} }
public virtual byte[] AsByteArray() public virtual Span<byte> AsByteArray()
{ {
var dataLength = this.data?.Length ?? 0; var dataLength = data?.Length ?? 0;
byte[] result = new byte[dataLength + this.header.Length]; var result = new byte[dataLength + header.Length];
using (var bw = new BinaryWriter(new MemoryStream(result))) using (var ms = new MemoryStream(result))
{ {
bw.Write(this.header, 0, 4); using (var bw = new BinaryWriter(ms))
bw.Write(dataLength);
if (dataLength > 0)
{ {
bw.Write(this.data); bw.Write(header, 0, 4);
bw.Write(dataLength);
if (dataLength > 0)
{
bw.Write(data);
}
} }
} }
return result; return result;
} }
public static int ExtractDataSize(byte[] data) public static int ExtractDataSize(ReadOnlySpan<byte> buf)
{ {
return BitConverter.ToInt32(data, 4); return BitConverter.ToInt32(buf.Slice(4));
} }
public short GetMessageID() public short GetMessageID()
@ -80,7 +86,7 @@ namespace ScreenLogicConnect.Messages
return BitConverter.ToInt16(header, 0); return BitConverter.ToInt16(header, 0);
} }
public string GetMessageIDasString() public string GetMessageIDAsString()
{ {
return GetMessageID().ToString(); return GetMessageID().ToString();
} }

View File

@ -18,6 +18,19 @@ namespace ScreenLogicConnect.Messages
return str; return str;
} }
public static string ExtractString(ReadOnlySpan<byte> buf)
{
var len = BitConverter.ToInt32(buf);
int startIdx = sizeof(int);
Span<char> chars = stackalloc char[len];
for (int chIdx = 0; chIdx < len; chIdx++)
{
chars[chIdx] = (char)buf[startIdx + chIdx];
}
return new string(chars);
}
public static RgbColor ExtractColor(BinaryReader br) public static RgbColor ExtractColor(BinaryReader br)
{ {
return new RgbColor( return new RgbColor(

View File

@ -7,10 +7,10 @@ namespace ScreenLogicConnect
public RgbColor color { get; private set; } public RgbColor color { get; private set; }
public string name { get; private set; } public string name { get; private set; }
public PentLightColor(string name, RgbColor color) public PentLightColor(string inName, RgbColor inColor)
{ {
this.name = name; name = inName;
this.color = color; color = inColor;
} }
public override string ToString() public override string ToString()

View File

@ -28,24 +28,22 @@ namespace ScreenLogicConnect
Debug.WriteLine("sending challenge string"); Debug.WriteLine("sending challenge string");
stream.SendHLMessage(Messages.ChallengeString.QUERY(0)); stream.SendHLMessage(Messages.ChallengeString.QUERY(0));
var recvBuf = new byte[1024]; var recvBuf = new byte[8];
var readBytes = stream.Read(recvBuf, 0, recvBuf.Length); var readBytes = await stream.ReadAsync(recvBuf, 0, recvBuf.Length);
Debug.WriteLine("read {0}", readBytes); Debug.WriteLine("read {0} bytes (header)", readBytes);
string challengeStr = null;
using (var ms = new MemoryStream(recvBuf)) var recvBody = new byte[Messages.HLMessage.ExtractDataSize(recvBuf)];
{ readBytes = await stream.ReadAsync(recvBody, 0, recvBody.Length);
using (var br = new BinaryReader(ms)) Debug.WriteLine("read {0} bytes (body)", readBytes);
{ string challengeStr = Messages.HLMessageTypeHelper.ExtractString(recvBody);
br.ReadBytes(8);
challengeStr = Messages.HLMessageTypeHelper.ExtractString(br);
}
}
Debug.WriteLine("sending login message"); Debug.WriteLine("sending login message");
stream.SendHLMessage(CreateLoginMessage(new HLEncoder(password).GetEncryptedPassword(challengeStr))); stream.SendHLMessage(CreateLoginMessage(new HLEncoder(password).GetEncryptedPassword(challengeStr)));
readBytes = stream.Read(recvBuf, 0, recvBuf.Length); readBytes = await stream.ReadAsync(recvBuf, 0, recvBuf.Length);
Debug.WriteLine("read {0}", readBytes); Debug.WriteLine("read {0}", readBytes);
recvBody = new byte[Messages.HLMessage.ExtractDataSize(recvBuf)];
await stream.ReadAsync(recvBody, 0, recvBody.Length);
return recvBuf[2] == Messages.ClientLogin.HLM_CLIENT_LOGIN + 1; return recvBuf[2] == Messages.ClientLogin.HLM_CLIENT_LOGIN + 1;
} }
@ -88,7 +86,7 @@ namespace ScreenLogicConnect
} }
int msgDataSize = Messages.HLMessage.ExtractDataSize(headerBuffer); int msgDataSize = Messages.HLMessage.ExtractDataSize(headerBuffer);
if (msgDataSize <= 0 || msgDataSize >= 100000) if (msgDataSize <= 0 || msgDataSize >= 100_000)
{ {
return null; return null;
} }
@ -97,7 +95,7 @@ namespace ScreenLogicConnect
bytesRead = 0; bytesRead = 0;
while (bytesRead < msgDataSize) while (bytesRead < msgDataSize)
{ {
bytesRead += await ns.ReadAsync((byte[])(Array)dataBuffer, bytesRead, msgDataSize - bytesRead); bytesRead += await ns.ReadAsync(dataBuffer, bytesRead, msgDataSize - bytesRead);
if (bytesRead < 0) if (bytesRead < 0)
{ {
@ -113,18 +111,10 @@ namespace ScreenLogicConnect
private const string connectionMessage = "CONNECTSERVERHOST\r\n\r\n"; private const string connectionMessage = "CONNECTSERVERHOST\r\n\r\n";
private byte[] CreateConnectServerSoftMessage() private byte[] CreateConnectServerSoftMessage()
{ {
using (var ms = new MemoryStream()) return Encoding.ASCII.GetBytes(connectionMessage);
{
using (var bw = new BinaryWriter(ms))
{
bw.Write(Encoding.ASCII.GetBytes(connectionMessage));
}
return ms.ToArray();
}
} }
private Messages.HLMessage CreateLoginMessage(byte[] encodedPwd) private Messages.HLMessage CreateLoginMessage(ReadOnlySpan<byte> encodedPwd)
{ {
Messages.ClientLogin login = Messages.ClientLogin.QUERY(0); Messages.ClientLogin login = Messages.ClientLogin.QUERY(0);
login.m_schema = 348; login.m_schema = 348;
@ -132,19 +122,22 @@ namespace ScreenLogicConnect
login.m_version = "ScreenLogicConnect library"; login.m_version = "ScreenLogicConnect library";
login.m_procID = 2; login.m_procID = 2;
if (encodedPwd == null) if (encodedPwd != null)
{ {
encodedPwd = new byte[16]; if (encodedPwd.Length > 16)
} {
login.m_password = new byte[16];
if (encodedPwd.Length > 16) encodedPwd.Slice(0, 16).CopyTo(login.m_password);
{ }
login.m_byteArray = new byte[16]; else
Array.Copy(encodedPwd, login.m_byteArray, 16); {
login.m_password = new byte[encodedPwd.Length];
encodedPwd.CopyTo(login.m_password);
}
} }
else else
{ {
login.m_byteArray = encodedPwd; login.m_password = new byte[16];
} }
return login; return login;