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. struct Endianness {
// Does not consider endian-ness 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> template<typename T>
std::string rawMemoryToString( T value ) { std::string rawMemoryToString( T value ) {
union { union {
@ -92,8 +105,14 @@ namespace Detail {
std::ostringstream oss; std::ostringstream oss;
oss << "0x"; 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(); 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 // This test case should not be included if you run with -e on the command line
SUCCEED(); SUCCEED();
} }
//TEST_CASE( "Is big endian" ) {
// CHECK( Catch::Detail::Endianness::which() == Catch::Detail::Endianness::Little );
//}