Considers endianness when printing raw memory into a string

This commit is contained in:
Phil Nash 2014-04-22 08:19:11 +01:00
parent 878c257de7
commit 48153e8e10
2 changed files with 27 additions and 4 deletions

View File

@ -79,8 +79,21 @@ namespace Detail {
}
};
// For display purposes only.
// Does not consider endian-ness
struct Endianness {
enum Arch { Big, Little };
static Arch which() {
union {
int asInt;
char asChar[sizeof (int)];
};
asInt = 1;
return ( asChar[sizeof(int)-1] == 1 ) ? Big : Little;
}
};
// Writes the raw memory into a string, considering endianness
template<typename T>
std::string rawMemoryToString( T value ) {
union {
@ -92,8 +105,14 @@ namespace Detail {
std::ostringstream oss;
oss << "0x";
for( unsigned char* cp = bytes; cp < bytes+sizeof(T); ++cp )
oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)*cp;
int i = 0, end = sizeof(T), inc = 1;
if( Endianness::which() == Endianness::Little ) {
i = end-1;
end = inc = -1;
}
for( ; i != end; i += inc )
oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)bytes[i];
return oss.str();
}

View File

@ -339,3 +339,7 @@ TEST_CASE("not allowed", "[!throws]")
// This test case should not be included if you run with -e on the command line
SUCCEED();
}
//TEST_CASE( "Is big endian" ) {
// CHECK( Catch::Detail::Endianness::which() == Catch::Detail::Endianness::Little );
//}