-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathDataConversion.cpp
More file actions
174 lines (148 loc) · 5.9 KB
/
DataConversion.cpp
File metadata and controls
174 lines (148 loc) · 5.9 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include "DataConversion.h"
// Combines two values of type int8_t into one uint16_t word
uint16_t DataConversion::mergeInt8ToUint16(int8_t firstI8Value, int8_t secondI8Value)
{
return ((uint16_t)firstI8Value << 8) | (uint8_t)secondI8Value;
}
// Separates a word of type uint16_t into two values of type int8_t
void DataConversion::splitUint16ToInt8(uint16_t valueUi16, int8_t &firstI8Value, int8_t &secondI8Value)
{
firstI8Value = (int8_t)(valueUi16 >> 8);
secondI8Value = (int8_t)(valueUi16 & 0xFF);
}
// Combines two values of type uint8_t into one uint16_t word
uint16_t DataConversion::mergeUint8ToUint16(uint8_t firstUi8Value, uint8_t secondUi8Value)
{
return ((uint16_t)firstUi8Value << 8) | secondUi8Value;
}
// Separates a word of type uint16_t into two values of type uint8_t
void DataConversion::splitUint16ToUint8(uint16_t valueUi16, uint8_t &firstUi8Value, uint8_t &secondUi8Value)
{
firstUi8Value = (uint8_t)(valueUi16 >> 8);
secondUi8Value = (uint8_t)(valueUi16 & 0xFF);
}
// Combines two words of type uint16_t into one int32_t value
int32_t DataConversion::mergeUint16ToInt32(uint16_t ui16part1, uint16_t ui16part2)
{
return ((int32_t)ui16part1 << 16) | ui16part2;
}
// Separates a value of type int32_t into two words of type uint16_t
void DataConversion::splitInt32ToUint16(int32_t valueI32, uint16_t &ui16part1, uint16_t &ui16part2)
{
ui16part1 = (uint16_t)(valueI32 >> 16);
ui16part2 = (uint16_t)(valueI32 & 0xFFFF);
}
// Combines two words of type uint16_t into one uint32_t value
uint32_t DataConversion::mergeUint16ToUint32(uint16_t ui16part1, uint16_t ui16part2)
{
return ((uint32_t)ui16part1 << 16) | ui16part2;
}
// Separates a value of type uint32_t into two words of type uint16_t
void DataConversion::splitUint32ToUint16(uint32_t valueUi32, uint16_t &ui16part1, uint16_t &ui16part2)
{
ui16part1 = (uint16_t)(valueUi32 >> 16);
ui16part2 = (uint16_t)(valueUi32 & 0xFFFF);
}
// Combines two uint16_t words into a float value.
float DataConversion::mergeUint16ToFloat32(uint16_t ui16part1, uint16_t ui16part2)
{
union
{
float floatValue;
uint32_t intValue;
} data;
data.intValue = ((uint32_t)ui16part1 << 16) | ui16part2;
return data.floatValue;
}
// Splits a float value into two uint16_t words.
void DataConversion::splitFloat32ToUint16(float valueF32, uint16_t &ui16part1, uint16_t &ui16part2)
{
union
{
float floatValue;
uint32_t intValue;
} data;
data.floatValue = valueF32;
ui16part1 = (uint16_t)(data.intValue >> 16);
ui16part2 = (uint16_t)(data.intValue & 0xFFFF);
}
// Combines four uint16_t words into an int64_t value.
int64_t DataConversion::mergeUint16ToInt64(uint16_t int64Part1, uint16_t int64Part2, uint16_t int64Part3, uint16_t int64Part4)
{
int64_t result = 0;
result |= ((int64_t)int64Part1 << 48);
result |= ((int64_t)int64Part2 << 32);
result |= ((int64_t)int64Part3 << 16);
result |= (int64_t)int64Part4;
return result;
}
// Splits an int64_t value into four uint16_t words.
void DataConversion::splitInt64ToUint16(int64_t valueI64, uint16_t &int64Part1, uint16_t &int64Part2, uint16_t &int64Part3, uint16_t &int64Part4)
{
int64Part1 = (uint16_t)(valueI64 >> 48);
int64Part2 = (uint16_t)(valueI64 >> 32);
int64Part3 = (uint16_t)(valueI64 >> 16);
int64Part4 = (uint16_t)valueI64;
}
// Combines four uint16_t words into a uint64_t value.
uint64_t DataConversion::mergeUint16ToUint64(uint16_t uint64Part1, uint16_t uint64Part2, uint16_t uint64Part3, uint16_t uint64Part4)
{
uint64_t result = 0;
result |= ((uint64_t)uint64Part1 << 48);
result |= ((uint64_t)uint64Part2 << 32);
result |= ((uint64_t)uint64Part3 << 16);
result |= (uint64_t)uint64Part4;
return result;
}
// Splits a uint64_t value into four uint16_t words.
void DataConversion::splitUint64ToUint16(uint64_t valueUi64, uint16_t &uint64Part1, uint16_t &uint64Part2, uint16_t &uint64Part3, uint16_t &uint64Part4)
{
uint64Part1 = (uint16_t)(valueUi64 >> 48);
uint64Part2 = (uint16_t)(valueUi64 >> 32);
uint64Part3 = (uint16_t)(valueUi64 >> 16);
uint64Part4 = (uint16_t)valueUi64;
}
// Combines four uint16_t parts into a double value.
double DataConversion::mergeUint16ToDouble(uint16_t dblPart1, uint16_t dblPart2, uint16_t dblPart3, uint16_t dblPart4)
{
uint64_t mergedValue = 0;
mergedValue |= ((uint64_t)dblPart1 << 48);
mergedValue |= ((uint64_t)dblPart2 << 32);
mergedValue |= ((uint64_t)dblPart3 << 16);
mergedValue |= (uint64_t)dblPart4;
double result = *reinterpret_cast<double *>(&mergedValue);
return result;
}
// Splits a double value into four uint16_t parts.
void DataConversion::splitDoubleToUint16(double dblValue, uint16_t &dblPart1, uint16_t &dblPart2, uint16_t &dblPart3, uint16_t &dblPart4)
{
uint64_t mergedValue = *reinterpret_cast<uint64_t *>(&dblValue);
dblPart1 = (uint16_t)(mergedValue >> 48);
dblPart2 = (uint16_t)(mergedValue >> 32);
dblPart3 = (uint16_t)(mergedValue >> 16);
dblPart4 = (uint16_t)mergedValue;
}
// Sets a specific bit in a uint16_t value.
uint16_t DataConversion::setBit(uint16_t data, uint8_t bitPosition)
{
if (bitPosition >= 16) return data; // Or handle error appropriately
return data | (1 << bitPosition);
}
// Clears a specific bit in a uint16_t value.
uint16_t DataConversion::clearBit(uint16_t data, uint8_t bitPosition)
{
if (bitPosition >= 16) return data; // Or handle error appropriately
return data & ~(1 << bitPosition);
}
// Reads a specific bit from a uint16_t value.
bool DataConversion::readBit(uint16_t data, uint8_t bitPosition)
{
if (bitPosition >= 16) return false; // Or handle error appropriately
return (data >> bitPosition) & 1;
}
// Toggles a specific bit in a uint16_t value.
uint16_t DataConversion::toggleBit(uint16_t data, uint8_t bitPosition)
{
if (bitPosition >= 16) return data; // Or handle error appropriately
return data ^ (1 << bitPosition);
}