10using System.Runtime.InteropServices;
14 public static class BitConverterNonAlloc {
18 private static ConversionStruct _c;
26 public static UInt16 ToUInt16(
byte[] bytes,
int offset = 0) {
29 fixed (
void* ptr = &bytes[offset]) {
34 _c.Byte0 = bytes[offset++];
35 _c.Byte1 = bytes[offset++];
44 public static Int16 ToInt16(
byte[] bytes,
int offset = 0) {
47 fixed (
void* ptr = &bytes[offset]) {
52 _c.Byte0 = bytes[offset++];
53 _c.Byte1 = bytes[offset++];
62 public static UInt32 ToUInt32(
byte[] bytes,
int offset = 0) {
65 fixed (
void* ptr = &bytes[offset]) {
70 _c.Byte0 = bytes[offset++];
71 _c.Byte1 = bytes[offset++];
72 _c.Byte2 = bytes[offset++];
73 _c.Byte3 = bytes[offset++];
82 public static Int32 ToInt32(
byte[] bytes,
int offset = 0) {
85 fixed (
void* ptr = &bytes[offset]) {
90 _c.Byte0 = bytes[offset++];
91 _c.Byte1 = bytes[offset++];
92 _c.Byte2 = bytes[offset++];
93 _c.Byte3 = bytes[offset++];
102 public static UInt64 ToUInt64(
byte[] bytes,
int offset = 0) {
105 fixed (
void* ptr = &bytes[offset]) {
106 return *(UInt64*)ptr;
110 _c.Byte0 = bytes[offset++];
111 _c.Byte1 = bytes[offset++];
112 _c.Byte2 = bytes[offset++];
113 _c.Byte3 = bytes[offset++];
114 _c.Byte4 = bytes[offset++];
115 _c.Byte5 = bytes[offset++];
116 _c.Byte6 = bytes[offset++];
117 _c.Byte7 = bytes[offset++];
126 public static Int64 ToInt64(
byte[] bytes,
int offset = 0) {
129 fixed (
void* ptr = &bytes[offset]) {
134 _c.Byte0 = bytes[offset++];
135 _c.Byte1 = bytes[offset++];
136 _c.Byte2 = bytes[offset++];
137 _c.Byte3 = bytes[offset++];
138 _c.Byte4 = bytes[offset++];
139 _c.Byte5 = bytes[offset++];
140 _c.Byte6 = bytes[offset++];
141 _c.Byte7 = bytes[offset++];
150 public static Single ToSingle(
byte[] bytes,
int offset = 0) {
153 fixed (
void* ptr = &bytes[offset]) {
154 return *(Single*)ptr;
158 _c.Byte0 = bytes[offset++];
159 _c.Byte1 = bytes[offset++];
160 _c.Byte2 = bytes[offset++];
161 _c.Byte3 = bytes[offset++];
170 public static Double ToDouble(
byte[] bytes,
int offset = 0) {
173 fixed (
void* ptr = &bytes[offset]) {
174 return *(Double*)ptr;
178 _c.Byte0 = bytes[offset++];
179 _c.Byte1 = bytes[offset++];
180 _c.Byte2 = bytes[offset++];
181 _c.Byte3 = bytes[offset++];
182 _c.Byte4 = bytes[offset++];
183 _c.Byte5 = bytes[offset++];
184 _c.Byte6 = bytes[offset++];
185 _c.Byte7 = bytes[offset++];
198 public static UInt16 ToUInt16(
byte[] bytes, ref
int offset) {
201 fixed (
void* ptr = &bytes[offset]) {
202 offset +=
sizeof(UInt16);
203 return *(UInt16*)ptr;
207 _c.Byte0 = bytes[offset++];
208 _c.Byte1 = bytes[offset++];
221 public static Int16 ToInt16(
byte[] bytes, ref
int offset) {
224 fixed (
void* ptr = &bytes[offset]) {
225 offset +=
sizeof(Int16);
230 _c.Byte0 = bytes[offset++];
231 _c.Byte1 = bytes[offset++];
244 public static UInt32 ToUInt32(
byte[] bytes, ref
int offset) {
247 fixed (
void* ptr = &bytes[offset]) {
248 offset +=
sizeof(UInt32);
249 return *(UInt32*)ptr;
253 _c.Byte0 = bytes[offset++];
254 _c.Byte1 = bytes[offset++];
255 _c.Byte2 = bytes[offset++];
256 _c.Byte3 = bytes[offset++];
269 public static Int32 ToInt32(
byte[] bytes, ref
int offset) {
272 fixed (
void* ptr = &bytes[offset]) {
273 offset +=
sizeof(Int32);
278 _c.Byte0 = bytes[offset++];
279 _c.Byte1 = bytes[offset++];
280 _c.Byte2 = bytes[offset++];
281 _c.Byte3 = bytes[offset++];
294 public static UInt64 ToUInt64(
byte[] bytes, ref
int offset) {
297 fixed (
void* ptr = &bytes[offset]) {
298 offset +=
sizeof(UInt64);
299 return *(UInt64*)ptr;
303 _c.Byte0 = bytes[offset++];
304 _c.Byte1 = bytes[offset++];
305 _c.Byte2 = bytes[offset++];
306 _c.Byte3 = bytes[offset++];
307 _c.Byte4 = bytes[offset++];
308 _c.Byte5 = bytes[offset++];
309 _c.Byte6 = bytes[offset++];
310 _c.Byte7 = bytes[offset++];
323 public static Int64 ToInt64(
byte[] bytes, ref
int offset) {
326 fixed (
void* ptr = &bytes[offset]) {
327 offset +=
sizeof(Int64);
332 _c.Byte0 = bytes[offset++];
333 _c.Byte1 = bytes[offset++];
334 _c.Byte2 = bytes[offset++];
335 _c.Byte3 = bytes[offset++];
336 _c.Byte4 = bytes[offset++];
337 _c.Byte5 = bytes[offset++];
338 _c.Byte6 = bytes[offset++];
339 _c.Byte7 = bytes[offset++];
352 public static Single ToSingle(
byte[] bytes, ref
int offset) {
355 fixed (
void* ptr = &bytes[offset]) {
356 offset +=
sizeof(Single);
357 return *(Single*)ptr;
361 _c.Byte0 = bytes[offset++];
362 _c.Byte1 = bytes[offset++];
363 _c.Byte2 = bytes[offset++];
364 _c.Byte3 = bytes[offset++];
377 public static Double ToDouble(
byte[] bytes, ref
int offset) {
380 fixed (
void* ptr = &bytes[offset]) {
381 offset +=
sizeof(Double);
382 return *(Double*)ptr;
386 _c.Byte0 = bytes[offset++];
387 _c.Byte1 = bytes[offset++];
388 _c.Byte2 = bytes[offset++];
389 _c.Byte3 = bytes[offset++];
390 _c.Byte4 = bytes[offset++];
391 _c.Byte5 = bytes[offset++];
392 _c.Byte6 = bytes[offset++];
393 _c.Byte7 = bytes[offset++];
403 public static void GetBytes(UInt16 value,
byte[] bytes,
int offset = 0) {
406 fixed (
void* ptr = &bytes[offset]) {
407 *(UInt16*)ptr = value;
412 bytes[offset++] = _c.Byte0;
413 bytes[offset++] = _c.Byte1;
422 public static void GetBytes(Int16 value,
byte[] bytes,
int offset = 0) {
425 fixed (
void* ptr = &bytes[offset]) {
426 *(Int16*)ptr = value;
431 bytes[offset++] = _c.Byte0;
432 bytes[offset++] = _c.Byte1;
441 public static void GetBytes(UInt32 value,
byte[] bytes,
int offset = 0) {
444 fixed (
void* ptr = &bytes[offset]) {
445 *(UInt32*)ptr = value;
450 bytes[offset++] = _c.Byte0;
451 bytes[offset++] = _c.Byte1;
452 bytes[offset++] = _c.Byte2;
453 bytes[offset++] = _c.Byte3;
462 public static void GetBytes(Int32 value,
byte[] bytes,
int offset = 0) {
465 fixed (
void* ptr = &bytes[offset]) {
466 *(Int32*)ptr = value;
471 bytes[offset++] = _c.Byte0;
472 bytes[offset++] = _c.Byte1;
473 bytes[offset++] = _c.Byte2;
474 bytes[offset++] = _c.Byte3;
483 public static void GetBytes(UInt64 value,
byte[] bytes,
int offset = 0) {
486 fixed (
void* ptr = &bytes[offset]) {
487 *(UInt64*)ptr = value;
492 bytes[offset++] = _c.Byte0;
493 bytes[offset++] = _c.Byte1;
494 bytes[offset++] = _c.Byte2;
495 bytes[offset++] = _c.Byte3;
496 bytes[offset++] = _c.Byte4;
497 bytes[offset++] = _c.Byte5;
498 bytes[offset++] = _c.Byte6;
499 bytes[offset++] = _c.Byte7;
508 public static void GetBytes(Int64 value,
byte[] bytes,
int offset = 0) {
511 fixed (
void* ptr = &bytes[offset]) {
512 *(Int64*)ptr = value;
517 bytes[offset++] = _c.Byte0;
518 bytes[offset++] = _c.Byte1;
519 bytes[offset++] = _c.Byte2;
520 bytes[offset++] = _c.Byte3;
521 bytes[offset++] = _c.Byte4;
522 bytes[offset++] = _c.Byte5;
523 bytes[offset++] = _c.Byte6;
524 bytes[offset++] = _c.Byte7;
533 public static void GetBytes(Single value,
byte[] bytes,
int offset = 0) {
536 fixed (
void* ptr = &bytes[offset]) {
537 *(Single*)ptr = value;
542 bytes[offset++] = _c.Byte0;
543 bytes[offset++] = _c.Byte1;
544 bytes[offset++] = _c.Byte2;
545 bytes[offset++] = _c.Byte3;
554 public static void GetBytes(Double value,
byte[] bytes,
int offset = 0) {
557 fixed (
void* ptr = &bytes[offset]) {
558 *(Double*)ptr = value;
563 bytes[offset++] = _c.Byte0;
564 bytes[offset++] = _c.Byte1;
565 bytes[offset++] = _c.Byte2;
566 bytes[offset++] = _c.Byte3;
567 bytes[offset++] = _c.Byte4;
568 bytes[offset++] = _c.Byte5;
569 bytes[offset++] = _c.Byte6;
570 bytes[offset++] = _c.Byte7;
582 public static void GetBytes(UInt16 value,
byte[] bytes, ref
int offset) {
585 fixed (
void* ptr = &bytes[offset]) {
586 offset +=
sizeof(UInt16);
587 *(UInt16*)ptr = value;
592 bytes[offset++] = _c.Byte0;
593 bytes[offset++] = _c.Byte1;
605 public static void GetBytes(Int16 value,
byte[] bytes, ref
int offset) {
608 fixed (
void* ptr = &bytes[offset]) {
609 offset +=
sizeof(Int16);
610 *(Int16*)ptr = value;
615 bytes[offset++] = _c.Byte0;
616 bytes[offset++] = _c.Byte1;
628 public static void GetBytes(UInt32 value,
byte[] bytes, ref
int offset) {
631 fixed (
void* ptr = &bytes[offset]) {
632 offset +=
sizeof(UInt32);
633 *(UInt32*)ptr = value;
638 bytes[offset++] = _c.Byte0;
639 bytes[offset++] = _c.Byte1;
640 bytes[offset++] = _c.Byte2;
641 bytes[offset++] = _c.Byte3;
653 public static void GetBytes(Int32 value,
byte[] bytes, ref
int offset) {
656 fixed (
void* ptr = &bytes[offset]) {
657 offset +=
sizeof(Int32);
658 *(Int32*)ptr = value;
663 bytes[offset++] = _c.Byte0;
664 bytes[offset++] = _c.Byte1;
665 bytes[offset++] = _c.Byte2;
666 bytes[offset++] = _c.Byte3;
678 public static void GetBytes(UInt64 value,
byte[] bytes, ref
int offset) {
681 fixed (
void* ptr = &bytes[offset]) {
682 offset +=
sizeof(UInt64);
683 *(UInt64*)ptr = value;
688 bytes[offset++] = _c.Byte0;
689 bytes[offset++] = _c.Byte1;
690 bytes[offset++] = _c.Byte2;
691 bytes[offset++] = _c.Byte3;
692 bytes[offset++] = _c.Byte4;
693 bytes[offset++] = _c.Byte5;
694 bytes[offset++] = _c.Byte6;
695 bytes[offset++] = _c.Byte7;
707 public static void GetBytes(Int64 value,
byte[] bytes, ref
int offset) {
710 fixed (
void* ptr = &bytes[offset]) {
711 offset +=
sizeof(Int64);
712 *(Int64*)ptr = value;
717 bytes[offset++] = _c.Byte0;
718 bytes[offset++] = _c.Byte1;
719 bytes[offset++] = _c.Byte2;
720 bytes[offset++] = _c.Byte3;
721 bytes[offset++] = _c.Byte4;
722 bytes[offset++] = _c.Byte5;
723 bytes[offset++] = _c.Byte6;
724 bytes[offset++] = _c.Byte7;
736 public static void GetBytes(Single value,
byte[] bytes, ref
int offset) {
739 fixed (
void* ptr = &bytes[offset]) {
740 offset +=
sizeof(Single);
741 *(Single*)ptr = value;
746 bytes[offset++] = _c.Byte0;
747 bytes[offset++] = _c.Byte1;
748 bytes[offset++] = _c.Byte2;
749 bytes[offset++] = _c.Byte3;
761 public static void GetBytes(Double value,
byte[] bytes, ref
int offset) {
764 fixed (
void* ptr = &bytes[offset]) {
765 offset +=
sizeof(Double);
766 *(Double*)ptr = value;
771 bytes[offset++] = _c.Byte0;
772 bytes[offset++] = _c.Byte1;
773 bytes[offset++] = _c.Byte2;
774 bytes[offset++] = _c.Byte3;
775 bytes[offset++] = _c.Byte4;
776 bytes[offset++] = _c.Byte5;
777 bytes[offset++] = _c.Byte6;
778 bytes[offset++] = _c.Byte7;
783 [StructLayout(LayoutKind.Explicit)]
784 private struct ConversionStruct {
803 public UInt16 UInt16;
807 public UInt32 UInt32;
811 public UInt64 UInt64;
815 public Single Single;
817 public Double Double;