4 * Simple helper functions for reading and writing BE and LE numbers
6 * Copyright (c) 2004 Steve McIntyre <steve@einval.com>
13 /* Write a 64-bit quantity out into memory in BIG ENDIAN order */
14 void write_be64(in, out)
15 unsigned long long in;
18 out[0] = (in >> 56) & 0xFF;
19 out[1] = (in >> 48) & 0xFF;
20 out[2] = (in >> 40) & 0xFF;
21 out[3] = (in >> 32) & 0xFF;
22 out[4] = (in >> 24) & 0xFF;
23 out[5] = (in >> 16) & 0xFF;
24 out[6] = (in >> 8) & 0xFF;
28 /* Read in a 64-bit BIG ENDIAN quantity */
29 unsigned long long read_be64(in)
32 unsigned long long result = 0;
34 result |= (unsigned long long)in[0] << 56;
35 result |= (unsigned long long)in[1] << 48;
36 result |= (unsigned long long)in[2] << 40;
37 result |= (unsigned long long)in[3] << 32;
38 result |= (unsigned long long)in[4] << 24;
39 result |= (unsigned long long)in[5] << 16;
40 result |= (unsigned long long)in[6] << 8;
41 result |= (unsigned long long)in[7];
46 /* Write a 64-bit quantity out into memory in LITTLE ENDIAN order */
47 void write_le64(in, out)
48 unsigned long long in;
52 out[1] = (in >> 8) & 0xFF;
53 out[2] = (in >> 16) & 0xFF;
54 out[3] = (in >> 24) & 0xFF;
55 out[4] = (in >> 32) & 0xFF;
56 out[5] = (in >> 40) & 0xFF;
57 out[6] = (in >> 48) & 0xFF;
58 out[7] = (in >> 56) & 0xFF;
61 /* Read in a 64-bit LITTLE ENDIAN quantity */
62 unsigned long long read_le64(in)
65 unsigned long long result = 0;
67 result |= (unsigned long long)in[0];
68 result |= (unsigned long long)in[1] << 8;
69 result |= (unsigned long long)in[2] << 16;
70 result |= (unsigned long long)in[3] << 24;
71 result |= (unsigned long long)in[4] << 32;
72 result |= (unsigned long long)in[5] << 40;
73 result |= (unsigned long long)in[6] << 48;
74 result |= (unsigned long long)in[7] << 56;
79 /* Write a 48-bit quantity out into memory in LITTLE ENDIAN order */
80 void write_le48(in, out)
81 unsigned long long in;
85 out[1] = (in >> 8) & 0xFF;
86 out[2] = (in >> 16) & 0xFF;
87 out[3] = (in >> 24) & 0xFF;
88 out[4] = (in >> 32) & 0xFF;
89 out[5] = (in >> 40) & 0xFF;
92 /* Read in a 48-bit LITTLE ENDIAN quantity */
93 unsigned long long read_le48(in)
96 unsigned long long result = 0;
98 result |= (unsigned long long)in[0];
99 result |= (unsigned long long)in[1] << 8;
100 result |= (unsigned long long)in[2] << 16;
101 result |= (unsigned long long)in[3] << 24;
102 result |= (unsigned long long)in[4] << 32;
103 result |= (unsigned long long)in[5] << 40;
108 /* Write a 32-bit quantity out into memory in BIG ENDIAN order */
109 void write_be32(in, out)
113 out[0] = (in >> 24) & 0xFF;
114 out[1] = (in >> 16) & 0xFF;
115 out[2] = (in >> 8) & 0xFF;
119 /* Read in a 32-bit BIG ENDIAN quantity */
120 unsigned long read_be32(in)
123 unsigned long result = 0;
125 result |= (unsigned long)in[0] << 24;
126 result |= (unsigned long)in[1] << 16;
127 result |= (unsigned long)in[2] << 8;
128 result |= (unsigned long)in[3];
133 /* Write a 32-bit quantity out into memory in LITTLE ENDIAN order */
134 void write_le32(in, out)
139 out[1] = (in >> 8) & 0xFF;
140 out[2] = (in >> 16) & 0xFF;
141 out[3] = (in >> 24) & 0xFF;
144 /* Read in a 32-bit LITTLE ENDIAN quantity */
145 unsigned long read_le32(in)
148 unsigned long result = 0;
150 result |= (unsigned long)in[0];
151 result |= (unsigned long)in[1] << 8;
152 result |= (unsigned long)in[2] << 16;
153 result |= (unsigned long)in[3] << 24;
158 /* Write a 16-bit quantity out into memory in BIG ENDIAN order */
159 void write_be16(in, out)
163 out[0] = (in >> 8) & 0xFF;
167 /* Read in a 16-bit BIG ENDIAN quantity */
168 unsigned short read_be16(in)
171 unsigned short result = 0;
173 result |= (unsigned short)in[0] << 8;
174 result |= (unsigned short)in[1];
178 /* Write a 16-bit quantity out into memory in LITTLE ENDIAN order */
179 void write_le16(in, out)
184 out[1] = in & 0xFF >> 8;
187 /* Read in a 16-bit LITTLE ENDIAN quantity */
188 unsigned short read_le16(in)
191 unsigned short result = 0;
193 result |= (unsigned short)in[0];
194 result |= (unsigned short)in[1] << 8;