LogString LOG4CXX_NS::hexdump()

in src/main/cpp/hexdump.cpp [34:116]


LogString LOG4CXX_NS::hexdump(const void* bytes, uint32_t len, HexdumpFlags flags){
	LogString ret;
	const uint8_t* bytes_u8 = static_cast<const uint8_t*>(bytes);
	LogStream sstream;
#if LOG4CXX_LOGCHAR_IS_WCHAR
	const wchar_t fill_char = L'0';
	const wchar_t space_fill_char = L' ';
#else
	const logchar fill_char = '0';
	const logchar space_fill_char = ' ';
#endif

	if(flags & HexdumpFlags::AddStartingNewline){
		sstream << LOG4CXX_EOL;
	}

	for(uint32_t offset = 0; offset < len; offset += 16){
		if(offset != 0){
			sstream << LOG4CXX_EOL;
		}

		// Print out the offset
		sstream << std::hex << std::setw(8) << std::setfill(fill_char) << offset << std::resetiosflags(std::ios_base::fmtflags(0));

		sstream << std::setw(0) << LOG4CXX_STR("  ");

		// Print out the first 8 bytes
		for(int byte = 0; byte < 8; byte++){
			if(offset + byte >= len){
				sstream << LOG4CXX_STR("  ");
				if(byte != 8){
					sstream << LOG4CXX_STR(" ");
				}
				continue;
			}

			sstream << std::hex << std::setw(2) << std::setfill(fill_char) << static_cast<int>(bytes_u8[offset + byte]) << std::resetiosflags(std::ios_base::fmtflags(0));
			sstream << std::setfill(space_fill_char);
			if(byte != 8){
				sstream << LOG4CXX_STR(" ");
			}
		}

		sstream << LOG4CXX_STR(" ");

		// Print out the last 8 bytes
		for(int byte = 8; byte < 16; byte++){
			if(offset + byte >= len){
				sstream << LOG4CXX_STR("  ");
				if(byte != 15){
					sstream << LOG4CXX_STR(" ");
				}
				continue;
			}

			sstream << std::hex << std::setw(2) << std::setfill(fill_char) << static_cast<int>(bytes_u8[offset + byte]) << std::resetiosflags(std::ios_base::fmtflags(0));
			if(byte != 15){
				sstream << LOG4CXX_STR(" ");
			}
		}

		// Print out the ASCII text
		sstream << LOG4CXX_STR("  |");
		for(int byte = 0; byte < 16; byte++){
			if(offset + byte >= len){
				break;
			}
			if(std::isprint(bytes_u8[offset + byte])){
				logchar to_append = bytes_u8[offset + byte];
				sstream << to_append;
			}else{
				sstream << LOG4CXX_STR(".");
			}
		}
		sstream << LOG4CXX_STR("|");
	}

	if(flags & HexdumpFlags::AddEndingNewline){
		sstream << LOG4CXX_EOL;
	}

	return sstream.str();
}