Guest User

Untitled

a guest
Oct 18th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.80 KB | None | 0 0
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace Ashkatchap.BitUtils {
  5. /// <summary>
  6. /// structs for converting simple types to bytes and back
  7. /// </summary>
  8. public static class FastBitConverter {
  9. public enum Endianness { Big = 0, Little = 1 };
  10.  
  11. private static int optSum = BitConverter.IsLittleEndian ? 0 : 1;
  12.  
  13. private static bool Option(Endianness endianness) {
  14. return ((optSum + (int) endianness) % 2) == 0;
  15. }
  16.  
  17. [StructLayout(LayoutKind.Explicit)]
  18. public struct Decimal {
  19. [FieldOffset(0)] public decimal Adecimal;
  20. [FieldOffset(0)] public byte b0;
  21. [FieldOffset(1)] public byte b1;
  22. [FieldOffset(2)] public byte b2;
  23. [FieldOffset(3)] public byte b3;
  24. [FieldOffset(4)] public byte b4;
  25. [FieldOffset(5)] public byte b5;
  26. [FieldOffset(6)] public byte b6;
  27. [FieldOffset(7)] public byte b7;
  28. [FieldOffset(8)] public byte b8;
  29. [FieldOffset(9)] public byte b9;
  30. [FieldOffset(10)] public byte b10;
  31. [FieldOffset(11)] public byte b11;
  32. [FieldOffset(12)] public byte b12;
  33. [FieldOffset(13)] public byte b13;
  34. [FieldOffset(14)] public byte b14;
  35. [FieldOffset(15)] public byte b15;
  36.  
  37. public Decimal(byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8, byte b9, byte b10, byte b11, byte b12, byte b13, byte b14, byte b15) {
  38. Adecimal = 0;
  39. this.b0 = b0;
  40. this.b1 = b1;
  41. this.b2 = b2;
  42. this.b3 = b3;
  43. this.b4 = b4;
  44. this.b5 = b5;
  45. this.b6 = b6;
  46. this.b7 = b7;
  47. this.b8 = b8;
  48. this.b9 = b9;
  49. this.b10 = b10;
  50. this.b11 = b11;
  51. this.b12 = b12;
  52. this.b13 = b13;
  53. this.b14 = b14;
  54. this.b15 = b15;
  55. }
  56. public Decimal(decimal Adecimal) {
  57. b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = b10 = b11 = b12 = b13 = b14 = b15 = 0;
  58. this.Adecimal = Adecimal;
  59. }
  60.  
  61. public void Write(byte[] buffer, int offset, Endianness endianness) {
  62. if (Option(endianness)) {
  63. buffer[offset + 15] = b0;
  64. buffer[offset + 14] = b1;
  65. buffer[offset + 13] = b2;
  66. buffer[offset + 12] = b3;
  67. buffer[offset + 11] = b4;
  68. buffer[offset + 10] = b5;
  69. buffer[offset + 9] = b6;
  70. buffer[offset + 8] = b7;
  71. buffer[offset + 7] = b8;
  72. buffer[offset + 6] = b9;
  73. buffer[offset + 5] = b10;
  74. buffer[offset + 4] = b11;
  75. buffer[offset + 3] = b12;
  76. buffer[offset + 2] = b13;
  77. buffer[offset + 1] = b14;
  78. buffer[offset] = b15;
  79. } else {
  80. buffer[offset] = b0;
  81. buffer[offset + 1] = b1;
  82. buffer[offset + 2] = b2;
  83. buffer[offset + 3] = b3;
  84. buffer[offset + 4] = b4;
  85. buffer[offset + 5] = b5;
  86. buffer[offset + 6] = b6;
  87. buffer[offset + 7] = b7;
  88. buffer[offset + 8] = b8;
  89. buffer[offset + 9] = b9;
  90. buffer[offset + 10] = b10;
  91. buffer[offset + 11] = b11;
  92. buffer[offset + 12] = b12;
  93. buffer[offset + 13] = b13;
  94. buffer[offset + 14] = b14;
  95. buffer[offset + 15] = b15;
  96. }
  97. }
  98. public decimal Read(byte[] buffer, int offset, Endianness endianness) {
  99. if (Option(endianness)) {
  100. b0 = buffer[offset + 15];
  101. b1 = buffer[offset + 14];
  102. b2 = buffer[offset + 13];
  103. b3 = buffer[offset + 12];
  104. b4 = buffer[offset + 11];
  105. b5 = buffer[offset + 10];
  106. b6 = buffer[offset + 9];
  107. b7 = buffer[offset + 8];
  108. b8 = buffer[offset + 7];
  109. b9 = buffer[offset + 6];
  110. b10 = buffer[offset + 5];
  111. b11 = buffer[offset + 4];
  112. b12 = buffer[offset + 3];
  113. b13 = buffer[offset + 2];
  114. b14 = buffer[offset + 1];
  115. b15 = buffer[offset];
  116. } else {
  117. b0 = buffer[offset];
  118. b1 = buffer[offset + 1];
  119. b2 = buffer[offset + 2];
  120. b3 = buffer[offset + 3];
  121. b4 = buffer[offset + 4];
  122. b5 = buffer[offset + 5];
  123. b6 = buffer[offset + 6];
  124. b7 = buffer[offset + 7];
  125. b8 = buffer[offset + 8];
  126. b9 = buffer[offset + 9];
  127. b10 = buffer[offset + 10];
  128. b11 = buffer[offset + 11];
  129. b12 = buffer[offset + 12];
  130. b13 = buffer[offset + 13];
  131. b14 = buffer[offset + 14];
  132. b15 = buffer[offset + 15];
  133. }
  134. return Adecimal;
  135. }
  136. }
  137.  
  138. [StructLayout(LayoutKind.Explicit)]
  139. public struct Double {
  140. [FieldOffset(0)] public double Adouble;
  141. [FieldOffset(0)] public byte b0;
  142. [FieldOffset(1)] public byte b1;
  143. [FieldOffset(2)] public byte b2;
  144. [FieldOffset(3)] public byte b3;
  145. [FieldOffset(4)] public byte b4;
  146. [FieldOffset(5)] public byte b5;
  147. [FieldOffset(6)] public byte b6;
  148. [FieldOffset(7)] public byte b7;
  149.  
  150. public Double(byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7) {
  151. Adouble = 0;
  152. this.b0 = b0;
  153. this.b1 = b1;
  154. this.b2 = b2;
  155. this.b3 = b3;
  156. this.b4 = b4;
  157. this.b5 = b5;
  158. this.b6 = b6;
  159. this.b7 = b7;
  160. }
  161. public Double(double Adouble) {
  162. b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = 0;
  163. this.Adouble = Adouble;
  164. }
  165.  
  166. public void Write(byte[] buffer, int offset, Endianness endianness) {
  167. if (Option(endianness)) {
  168. buffer[offset + 7] = b0;
  169. buffer[offset + 6] = b1;
  170. buffer[offset + 5] = b2;
  171. buffer[offset + 4] = b3;
  172. buffer[offset + 3] = b4;
  173. buffer[offset + 2] = b5;
  174. buffer[offset + 1] = b6;
  175. buffer[offset] = b7;
  176. } else {
  177. buffer[offset] = b0;
  178. buffer[offset + 1] = b1;
  179. buffer[offset + 2] = b2;
  180. buffer[offset + 3] = b3;
  181. buffer[offset + 4] = b4;
  182. buffer[offset + 5] = b5;
  183. buffer[offset + 6] = b6;
  184. buffer[offset + 7] = b7;
  185. }
  186. }
  187. public double Read(byte[] buffer, int offset, Endianness endianness) {
  188. if (Option(endianness)) {
  189. b0 = buffer[offset + 7];
  190. b1 = buffer[offset + 6];
  191. b2 = buffer[offset + 5];
  192. b3 = buffer[offset + 4];
  193. b4 = buffer[offset + 3];
  194. b5 = buffer[offset + 2];
  195. b6 = buffer[offset + 1];
  196. b7 = buffer[offset];
  197. } else {
  198. b0 = buffer[offset];
  199. b1 = buffer[offset + 1];
  200. b2 = buffer[offset + 2];
  201. b3 = buffer[offset + 3];
  202. b4 = buffer[offset + 4];
  203. b5 = buffer[offset + 5];
  204. b6 = buffer[offset + 6];
  205. b7 = buffer[offset + 7];
  206. }
  207. return Adouble;
  208. }
  209. }
  210. [StructLayout(LayoutKind.Explicit)]
  211. public struct Long {
  212. [FieldOffset(0)] public long Along;
  213. [FieldOffset(0)] public byte b0;
  214. [FieldOffset(1)] public byte b1;
  215. [FieldOffset(2)] public byte b2;
  216. [FieldOffset(3)] public byte b3;
  217. [FieldOffset(4)] public byte b4;
  218. [FieldOffset(5)] public byte b5;
  219. [FieldOffset(6)] public byte b6;
  220. [FieldOffset(7)] public byte b7;
  221.  
  222. public Long(byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7) {
  223. Along = 0;
  224. this.b0 = b0;
  225. this.b1 = b1;
  226. this.b2 = b2;
  227. this.b3 = b3;
  228. this.b4 = b4;
  229. this.b5 = b5;
  230. this.b6 = b6;
  231. this.b7 = b7;
  232. }
  233. public Long(long Along) {
  234. b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = 0;
  235. this.Along = Along;
  236. }
  237.  
  238. public void Write(byte[] buffer, int offset, Endianness endianness) {
  239. if (Option(endianness)) {
  240. buffer[offset + 7] = b0;
  241. buffer[offset + 6] = b1;
  242. buffer[offset + 5] = b2;
  243. buffer[offset + 4] = b3;
  244. buffer[offset + 3] = b4;
  245. buffer[offset + 2] = b5;
  246. buffer[offset + 1] = b6;
  247. buffer[offset] = b7;
  248. } else {
  249. buffer[offset] = b0;
  250. buffer[offset + 1] = b1;
  251. buffer[offset + 2] = b2;
  252. buffer[offset + 3] = b3;
  253. buffer[offset + 4] = b4;
  254. buffer[offset + 5] = b5;
  255. buffer[offset + 6] = b6;
  256. buffer[offset + 7] = b7;
  257. }
  258. }
  259. public long Read(byte[] buffer, int offset, Endianness endianness) {
  260. if (Option(endianness)) {
  261. b0 = buffer[offset + 7];
  262. b1 = buffer[offset + 6];
  263. b2 = buffer[offset + 5];
  264. b3 = buffer[offset + 4];
  265. b4 = buffer[offset + 3];
  266. b5 = buffer[offset + 2];
  267. b6 = buffer[offset + 1];
  268. b7 = buffer[offset];
  269. } else {
  270. b0 = buffer[offset];
  271. b1 = buffer[offset + 1];
  272. b2 = buffer[offset + 2];
  273. b3 = buffer[offset + 3];
  274. b4 = buffer[offset + 4];
  275. b5 = buffer[offset + 5];
  276. b6 = buffer[offset + 6];
  277. b7 = buffer[offset + 7];
  278. }
  279. return Along;
  280. }
  281. }
  282. [StructLayout(LayoutKind.Explicit)]
  283. public struct Ulong {
  284. [FieldOffset(0)] public ulong Aulong;
  285. [FieldOffset(0)] public byte b0;
  286. [FieldOffset(1)] public byte b1;
  287. [FieldOffset(2)] public byte b2;
  288. [FieldOffset(3)] public byte b3;
  289. [FieldOffset(4)] public byte b4;
  290. [FieldOffset(5)] public byte b5;
  291. [FieldOffset(6)] public byte b6;
  292. [FieldOffset(7)] public byte b7;
  293.  
  294. public Ulong(byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7) {
  295. Aulong = 0;
  296. this.b0 = b0;
  297. this.b1 = b1;
  298. this.b2 = b2;
  299. this.b3 = b3;
  300. this.b4 = b4;
  301. this.b5 = b5;
  302. this.b6 = b6;
  303. this.b7 = b7;
  304. }
  305. public Ulong(ulong Aulong) {
  306. b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = 0;
  307. this.Aulong = Aulong;
  308. }
  309.  
  310. public void Write(byte[] buffer, int offset, Endianness endianness) {
  311. if (Option(endianness)) {
  312. buffer[offset + 7] = b0;
  313. buffer[offset + 6] = b1;
  314. buffer[offset + 5] = b2;
  315. buffer[offset + 4] = b3;
  316. buffer[offset + 3] = b4;
  317. buffer[offset + 2] = b5;
  318. buffer[offset + 1] = b6;
  319. buffer[offset] = b7;
  320. } else {
  321. buffer[offset] = b0;
  322. buffer[offset + 1] = b1;
  323. buffer[offset + 2] = b2;
  324. buffer[offset + 3] = b3;
  325. buffer[offset + 4] = b4;
  326. buffer[offset + 5] = b5;
  327. buffer[offset + 6] = b6;
  328. buffer[offset + 7] = b7;
  329. }
  330. }
  331. public ulong Read(byte[] buffer, int offset, Endianness endianness) {
  332. if (Option(endianness)) {
  333. b0 = buffer[offset + 7];
  334. b1 = buffer[offset + 6];
  335. b2 = buffer[offset + 5];
  336. b3 = buffer[offset + 4];
  337. b4 = buffer[offset + 3];
  338. b5 = buffer[offset + 2];
  339. b6 = buffer[offset + 1];
  340. b7 = buffer[offset];
  341. } else {
  342. b0 = buffer[offset];
  343. b1 = buffer[offset + 1];
  344. b2 = buffer[offset + 2];
  345. b3 = buffer[offset + 3];
  346. b4 = buffer[offset + 4];
  347. b5 = buffer[offset + 5];
  348. b6 = buffer[offset + 6];
  349. b7 = buffer[offset + 7];
  350. }
  351. return Aulong;
  352. }
  353. }
  354.  
  355. [StructLayout(LayoutKind.Explicit)]
  356. public struct Float {
  357. [FieldOffset(0)] public float Afloat;
  358. [FieldOffset(0)] public byte b0;
  359. [FieldOffset(1)] public byte b1;
  360. [FieldOffset(2)] public byte b2;
  361. [FieldOffset(3)] public byte b3;
  362.  
  363. public Float(byte b0, byte b1, byte b2, byte b3) {
  364. Afloat = 0;
  365. this.b0 = b0;
  366. this.b1 = b1;
  367. this.b2 = b2;
  368. this.b3 = b3;
  369. }
  370. public Float(float Afloat) {
  371. b0 = b1 = b2 = b3 = 0;
  372. this.Afloat = Afloat;
  373. }
  374.  
  375. public void Write(byte[] buffer, int offset, Endianness endianness) {
  376. if (Option(endianness)) {
  377. buffer[offset + 3] = b0;
  378. buffer[offset + 2] = b1;
  379. buffer[offset + 1] = b2;
  380. buffer[offset] = b3;
  381. } else {
  382. buffer[offset] = b0;
  383. buffer[offset + 1] = b1;
  384. buffer[offset + 2] = b2;
  385. buffer[offset + 3] = b3;
  386. }
  387. }
  388. public float Read(byte[] buffer, int offset, Endianness endianness) {
  389. if (Option(endianness)) {
  390. b0 = buffer[offset + 3];
  391. b1 = buffer[offset + 2];
  392. b2 = buffer[offset + 1];
  393. b3 = buffer[offset];
  394. } else {
  395. b0 = buffer[offset];
  396. b1 = buffer[offset + 1];
  397. b2 = buffer[offset + 2];
  398. b3 = buffer[offset + 3];
  399. }
  400. return Afloat;
  401. }
  402. }
  403. [StructLayout(LayoutKind.Explicit)]
  404. public struct Int {
  405. [FieldOffset(0)] public int Aint;
  406. [FieldOffset(0)] public byte b0;
  407. [FieldOffset(1)] public byte b1;
  408. [FieldOffset(2)] public byte b2;
  409. [FieldOffset(3)] public byte b3;
  410.  
  411. public Int(byte b0, byte b1, byte b2, byte b3) {
  412. Aint = 0;
  413. this.b0 = b0;
  414. this.b1 = b1;
  415. this.b2 = b2;
  416. this.b3 = b3;
  417. }
  418. public Int(int Aint) {
  419. b0 = b1 = b2 = b3 = 0;
  420. this.Aint = Aint;
  421. }
  422.  
  423. public void Write(byte[] buffer, int offset, Endianness endianness) {
  424. if (Option(endianness)) {
  425. buffer[offset + 3] = b0;
  426. buffer[offset + 2] = b1;
  427. buffer[offset + 1] = b2;
  428. buffer[offset] = b3;
  429. } else {
  430. buffer[offset] = b0;
  431. buffer[offset + 1] = b1;
  432. buffer[offset + 2] = b2;
  433. buffer[offset + 3] = b3;
  434. }
  435. }
  436. public int Read(byte[] buffer, int offset, Endianness endianness) {
  437. if (Option(endianness)) {
  438. b0 = buffer[offset + 3];
  439. b1 = buffer[offset + 2];
  440. b2 = buffer[offset + 1];
  441. b3 = buffer[offset];
  442. } else {
  443. b0 = buffer[offset];
  444. b1 = buffer[offset + 1];
  445. b2 = buffer[offset + 2];
  446. b3 = buffer[offset + 3];
  447. }
  448. return Aint;
  449. }
  450. }
  451. [StructLayout(LayoutKind.Explicit)]
  452. public struct Uint {
  453. [FieldOffset(0)] public uint Auint;
  454. [FieldOffset(0)] public byte b0;
  455. [FieldOffset(1)] public byte b1;
  456. [FieldOffset(2)] public byte b2;
  457. [FieldOffset(3)] public byte b3;
  458.  
  459. public Uint(byte b0, byte b1, byte b2, byte b3) {
  460. Auint = 0;
  461. this.b0 = b0;
  462. this.b1 = b1;
  463. this.b2 = b2;
  464. this.b3 = b3;
  465. }
  466. public Uint(uint Auint) {
  467. b0 = b1 = b2 = b3 = 0;
  468. this.Auint = Auint;
  469. }
  470.  
  471. public void Write(byte[] buffer, int offset, Endianness endianness) {
  472. if (Option(endianness)) {
  473. buffer[offset + 3] = b0;
  474. buffer[offset + 2] = b1;
  475. buffer[offset + 1] = b2;
  476. buffer[offset] = b3;
  477. } else {
  478. buffer[offset] = b0;
  479. buffer[offset + 1] = b1;
  480. buffer[offset + 2] = b2;
  481. buffer[offset + 3] = b3;
  482. }
  483. }
  484. public uint Read(byte[] buffer, int offset, Endianness endianness) {
  485. if (Option(endianness)) {
  486. b0 = buffer[offset + 3];
  487. b1 = buffer[offset + 2];
  488. b2 = buffer[offset + 1];
  489. b3 = buffer[offset];
  490. } else {
  491. b0 = buffer[offset];
  492. b1 = buffer[offset + 1];
  493. b2 = buffer[offset + 2];
  494. b3 = buffer[offset + 3];
  495. }
  496. return Auint;
  497. }
  498. }
  499.  
  500. [StructLayout(LayoutKind.Explicit)]
  501. public struct Char {
  502. [FieldOffset(0)] public char Achar;
  503. [FieldOffset(0)] public byte b0;
  504. [FieldOffset(1)] public byte b1;
  505.  
  506. public Char(byte b0, byte b1) {
  507. Achar = '0';
  508. this.b0 = b0;
  509. this.b1 = b1;
  510. }
  511. public Char(char Achar) {
  512. b0 = b1 = 0;
  513. this.Achar = Achar;
  514. }
  515.  
  516. public void Write(byte[] buffer, int offset, Endianness endianness) {
  517. if (Option(endianness)) {
  518. buffer[offset + 1] = b0;
  519. buffer[offset] = b1;
  520. } else {
  521. buffer[offset] = b0;
  522. buffer[offset + 1] = b1;
  523. }
  524. }
  525. public char Read(byte[] buffer, int offset, Endianness endianness) {
  526. if (Option(endianness)) {
  527. b0 = buffer[offset + 1];
  528. b1 = buffer[offset];
  529. } else {
  530. b0 = buffer[offset];
  531. b1 = buffer[offset + 1];
  532. }
  533. return Achar;
  534. }
  535. }
  536. [StructLayout(LayoutKind.Explicit)]
  537. public struct Short {
  538. [FieldOffset(0)] public short Ashort;
  539. [FieldOffset(0)] public byte b0;
  540. [FieldOffset(1)] public byte b1;
  541.  
  542. public Short(byte b0, byte b1) {
  543. Ashort = 0;
  544. this.b0 = b0;
  545. this.b1 = b1;
  546. }
  547. public Short(short Ashort) {
  548. b0 = b1 = 0;
  549. this.Ashort = Ashort;
  550. }
  551.  
  552. public void Write(byte[] buffer, int offset, Endianness endianness) {
  553. if (Option(endianness)) {
  554. buffer[offset + 1] = b0;
  555. buffer[offset] = b1;
  556. } else {
  557. buffer[offset] = b0;
  558. buffer[offset + 1] = b1;
  559. }
  560. }
  561. public short Read(byte[] buffer, int offset, Endianness endianness) {
  562. if (Option(endianness)) {
  563. b0 = buffer[offset + 1];
  564. b1 = buffer[offset];
  565. } else {
  566. b0 = buffer[offset];
  567. b1 = buffer[offset + 1];
  568. }
  569. return Ashort;
  570. }
  571. }
  572. [StructLayout(LayoutKind.Explicit)]
  573. public struct Ushort {
  574. [FieldOffset(0)] public ushort Aushort;
  575. [FieldOffset(0)] public byte b0;
  576. [FieldOffset(1)] public byte b1;
  577.  
  578. public Ushort(byte b0, byte b1) {
  579. Aushort = 0;
  580. this.b0 = b0;
  581. this.b1 = b1;
  582. }
  583. public Ushort(ushort Aushort) {
  584. b0 = b1 = 0;
  585. this.Aushort = Aushort;
  586. }
  587.  
  588. public void Write(byte[] buffer, int offset, Endianness endianness) {
  589. if (Option(endianness)) {
  590. buffer[offset + 1] = b0;
  591. buffer[offset] = b1;
  592. } else {
  593. buffer[offset] = b0;
  594. buffer[offset + 1] = b1;
  595. }
  596. }
  597. public ushort Read(byte[] buffer, int offset, Endianness endianness) {
  598. if (Option(endianness)) {
  599. b0 = buffer[offset + 1];
  600. b1 = buffer[offset];
  601. } else {
  602. b0 = buffer[offset];
  603. b1 = buffer[offset + 1];
  604. }
  605. return Aushort;
  606. }
  607. }
  608. }
  609. }
Add Comment
Please, Sign In to add comment