Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
short net_to_host(short s) {
char const* bytes = &s;
return (static_cast<short const>(bytes[0]) << 8) | bytes[1];
} LittleEndian(const LittleEndian<T> & t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = t.bytes[i];
}
BigEndian(const BigEndian<T> & t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = t.bytes[i];
}
template<typename T>
union LittleEndian
{
unsigned char bytes[sizeof(T)];
T w;
…
LittleEndian(const LittleEndian & t) {
w = t.w;
}
T operator = (const T t)
{
reinterpret_cast<T&>(bytes) = t;
return t;
}
template<typename T>
struct LittleEndian
{
union {
unsigned char bytes[sizeof(T)];
T w;
}
...
}
LittleEndian<unsigned int> a = 0;
std::cout << ++a << std::endl;
std::cout << a++ << std::endl;
1
2
#include <iostream>
int main() {
unsigned char be_unit[4] = {}; be_unit[3] = 1;
BigEndian<int> be(*((int *) &be_unit));
LittleEndian<int> le(be);
std::cout << (int) be << "\n"; // 16777216
std::cout << (int) le << "\n"; // 16777216
};
LittleEndian::LittleEndian(const T * p) {
const unsigned char * pc = (const unsigned char*) p;
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = *pc++;
};
BigEndian::BigEndian(const T * p) {
const unsigned char * pc = (const unsigned char*) p;
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = *pc++;
};
LittleEndian::operator const T() const {
return raw_value;
}
BigEndian::operator const T() const {
return raw_value;
}
return raw_value;, значит данные лежат как LittleEndian и только.unsigned char raw[4] = {}; raw[3] = 1;
// Big-endian platform (ex. MAC OS X on PPC) output: 1
// Little-endian platform (ex. MAC OS X on PPC) output: 16777216
std::cout << *((__int32 *) &raw) << "\n";
Little-Endian против Big-Endian