-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathendian_conv.cpp
More file actions
135 lines (125 loc) · 2.5 KB
/
Copy pathendian_conv.cpp
File metadata and controls
135 lines (125 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "common.h"
#include "endian_conv.h"
static union { char c[4]; unsigned long mylong; } endian_test = { { LITTLE_ENDIAN_VAL, '?', '?', BIG_ENDIAN_VAL } };
#define ENV_ENDIAN_VAL ((char)endian_test.mylong)
#define ENV_IS_LITTEL_ENDIAN (ENV_ENDIAN_VAL == LITTLE_ENDIAN_VAL)
#define ENV_IS_BIG_ENDIAN (ENV_ENDIAN_VAL == BIG_ENDIAN_VAL)
char env_endian()
{
return ENV_ENDIAN_VAL;
}
int16_t endian_to_int16(char *src, char src_endian)
{
if (src_endian == ENV_ENDIAN_VAL) {
return *(int16_t*)src;
}
int16_t ret;
char *p = (char*)&ret;
p[0] = src[1];
p[1] = src[0];
return ret;
}
int32_t endian_to_int32(char *src, char src_endian)
{
if (src_endian == ENV_ENDIAN_VAL) {
return *(int32_t*)src;
}
int32_t ret;
char *p = (char*)&ret;
p[0] = src[3];
p[1] = src[2];
p[2] = src[1];
p[3] = src[0];
return ret;
}
int64_t endian_to_int64(char *src, char src_endian)
{
if (src_endian == ENV_ENDIAN_VAL) {
return *(int64_t*)src;
}
int64_t ret;
char *p = (char*)&ret;
p[0] = src[7];
p[1] = src[6];
p[2] = src[5];
p[3] = src[4];
p[4] = src[3];
p[5] = src[2];
p[6] = src[1];
p[7] = src[0];
return ret;
}
int64_t endian_to_integer(char *src, char src_bytes, char src_endian)
{
switch (src_bytes)
{
case 1 :
return *src;
case 2 :
return endian_to_int16(src, src_endian);
case 4 :
return endian_to_int32(src, src_endian);
case 8 :
return endian_to_int64(src, src_endian);
default:
return 0;
}
}
void endian_from_int16(int16_t src, char *dest, char dest_endian)
{
if (dest_endian == ENV_ENDIAN_VAL) {
*(int16_t*)dest = src;
return;
}
char *p = (char*)&src;
dest[0] = p[1];
dest[1] = p[0];
}
void endian_from_int32(int32_t src, char *dest, char dest_endian)
{
if (dest_endian == ENV_ENDIAN_VAL) {
*(int32_t*)dest = src;
return;
}
char *p = (char*)&src;
dest[0] = p[3];
dest[1] = p[2];
dest[2] = p[1];
dest[3] = p[0];
}
void endian_from_int64(int64_t src, char *dest, char dest_endian)
{
if (dest_endian == ENV_ENDIAN_VAL) {
*(int64_t*)dest = src;
return;
}
char *p = (char*)&src;
dest[0] = p[7];
dest[1] = p[6];
dest[2] = p[5];
dest[3] = p[4];
dest[4] = p[3];
dest[5] = p[2];
dest[6] = p[1];
dest[7] = p[0];
}
void endian_from_integer(int64_t src, char *dest, char dest_bytes, char dest_endian)
{
switch (dest_bytes)
{
case 1:
*dest = src;
return;
case 2:
endian_from_int16(src, dest, dest_endian);
return;
case 4:
endian_from_int32(src, dest, dest_endian);
return;
case 8:
endian_from_int64(src, dest, dest_endian);
return;
default:
return;
}
}