4 * Copyright (c) 2004-2006 Steve McIntyre <steve@einval.com>
6 * Simple helper routines for marshalling data
12 #include "endianconv.h"
14 /* Write a 64-bit quantity out into memory in BIG ENDIAN order */
15 void write_be64(unsigned long long in, unsigned char *out)
17 out[0] = (in >> 56) & 0xFF;
18 out[1] = (in >> 48) & 0xFF;
19 out[2] = (in >> 40) & 0xFF;
20 out[3] = (in >> 32) & 0xFF;
21 out[4] = (in >> 24) & 0xFF;
22 out[5] = (in >> 16) & 0xFF;
23 out[6] = (in >> 8) & 0xFF;
27 /* Read in a 64-bit BIG ENDIAN quantity */
28 unsigned long long read_be64(unsigned char *in)
30 unsigned long long result = 0;
32 result |= (unsigned long long)in[0] << 56;
33 result |= (unsigned long long)in[1] << 48;
34 result |= (unsigned long long)in[2] << 40;
35 result |= (unsigned long long)in[3] << 32;
36 result |= (unsigned long long)in[4] << 24;
37 result |= (unsigned long long)in[5] << 16;
38 result |= (unsigned long long)in[6] << 8;
39 result |= (unsigned long long)in[7];
44 /* Write a 64-bit quantity out into memory in LITTLE ENDIAN order */
45 void write_le64(unsigned long long in, unsigned char *out)
48 out[1] = (in >> 8) & 0xFF;
49 out[2] = (in >> 16) & 0xFF;
50 out[3] = (in >> 24) & 0xFF;
51 out[4] = (in >> 32) & 0xFF;
52 out[5] = (in >> 40) & 0xFF;
53 out[6] = (in >> 48) & 0xFF;
54 out[7] = (in >> 56) & 0xFF;
57 /* Read in a 64-bit LITTLE ENDIAN quantity */
58 unsigned long long read_le64(unsigned char *in)
60 unsigned long long result = 0;
62 result |= (unsigned long long)in[0];
63 result |= (unsigned long long)in[1] << 8;
64 result |= (unsigned long long)in[2] << 16;
65 result |= (unsigned long long)in[3] << 24;
66 result |= (unsigned long long)in[4] << 32;
67 result |= (unsigned long long)in[5] << 40;
68 result |= (unsigned long long)in[6] << 48;
69 result |= (unsigned long long)in[7] << 56;
74 /* Write a 48-bit quantity out into memory in LITTLE ENDIAN order */
75 void write_le48(unsigned long long in, unsigned char *out)
78 out[1] = (in >> 8) & 0xFF;
79 out[2] = (in >> 16) & 0xFF;
80 out[3] = (in >> 24) & 0xFF;
81 out[4] = (in >> 32) & 0xFF;
82 out[5] = (in >> 40) & 0xFF;
85 /* Read in a 48-bit LITTLE ENDIAN quantity */
86 unsigned long long read_le48(unsigned char *in)
88 unsigned long long result = 0;
90 result |= (unsigned long long)in[0];
91 result |= (unsigned long long)in[1] << 8;
92 result |= (unsigned long long)in[2] << 16;
93 result |= (unsigned long long)in[3] << 24;
94 result |= (unsigned long long)in[4] << 32;
95 result |= (unsigned long long)in[5] << 40;
100 /* Write a 32-bit quantity out into memory in BIG ENDIAN order */
101 void write_be32(unsigned long in, unsigned char *out)
103 out[0] = (in >> 24) & 0xFF;
104 out[1] = (in >> 16) & 0xFF;
105 out[2] = (in >> 8) & 0xFF;
109 /* Read in a 32-bit BIG ENDIAN quantity */
110 unsigned long read_be32(unsigned char *in)
112 unsigned long result = 0;
114 result |= (unsigned long)in[0] << 24;
115 result |= (unsigned long)in[1] << 16;
116 result |= (unsigned long)in[2] << 8;
117 result |= (unsigned long)in[3];
122 /* Write a 32-bit quantity out into memory in LITTLE ENDIAN order */
123 void write_le32(unsigned long in, unsigned char *out)
126 out[1] = (in >> 8) & 0xFF;
127 out[2] = (in >> 16) & 0xFF;
128 out[3] = (in >> 24) & 0xFF;
131 /* Read in a 32-bit LITTLE ENDIAN quantity */
132 unsigned long read_le32(unsigned char *in)
134 unsigned long result = 0;
136 result |= (unsigned long)in[0];
137 result |= (unsigned long)in[1] << 8;
138 result |= (unsigned long)in[2] << 16;
139 result |= (unsigned long)in[3] << 24;
144 /* Write a 16-bit quantity out into memory in BIG ENDIAN order */
145 void write_be16(unsigned short in, unsigned char *out)
147 out[0] = (in >> 8) & 0xFF;
151 /* Read in a 16-bit BIG ENDIAN quantity */
152 unsigned short read_be16(unsigned char *in)
154 unsigned short result = 0;
156 result |= (unsigned short)in[0] << 8;
157 result |= (unsigned short)in[1];
161 /* Write a 16-bit quantity out into memory in LITTLE ENDIAN order */
162 void write_le16(unsigned short in, unsigned char *out)
165 out[1] = in & 0xFF >> 8;
168 /* Read in a 16-bit LITTLE ENDIAN quantity */
169 unsigned short read_le16(unsigned char *in)
171 unsigned short result = 0;
173 result |= (unsigned short)in[0];
174 result |= (unsigned short)in[1] << 8;