#include "HexView.h" #include #include #include #ifdef _WIN32 #include #endif void HexView::display(const std::vector& data, size_t startOffset, size_t lines) { const size_t bytesPerLine = 16; size_t endOffset = (startOffset + lines * bytesPerLine) < data.size() ? (startOffset + lines * bytesPerLine) : data.size(); for (size_t offset = startOffset; offset < endOffset; offset += bytesPerLine) { std::cout << std::hex << std::setw(8) << std::setfill('0') << offset << " "; printHexLine(data, offset, bytesPerLine); std::cout << " "; printAsciiLine(data, offset, bytesPerLine); std::cout << std::endl; } } void HexView::displayCompare(const std::vector& data1, const std::vector& data2, size_t startOffset, size_t lines) { const size_t bytesPerLine = 16; size_t maxSize = data1.size() > data2.size() ? data1.size() : data2.size(); size_t endOffset = (startOffset + lines * bytesPerLine) < maxSize ? (startOffset + lines * bytesPerLine) : maxSize; for (size_t offset = startOffset; offset < endOffset; offset += bytesPerLine) { // Print offset std::cout << std::hex << std::setw(8) << std::setfill('0') << offset << " "; // Print left side hex for (size_t i = 0; i < bytesPerLine; i++) { size_t currentOffset = offset + i; if (currentOffset < data1.size()) { std::string color = getByteColor(currentOffset, data1[currentOffset]); std::cout << color << std::hex << std::setw(2) << std::setfill('0') << static_cast(data1[currentOffset]) << " "; } else { std::cout << " "; } } std::cout << "\033[0m "; // Reset color // Print right side hex for (size_t i = 0; i < bytesPerLine; i++) { size_t currentOffset = offset + i; if (currentOffset < data2.size()) { std::string color = getByteColor(currentOffset, data2[currentOffset]); std::cout << color << std::hex << std::setw(2) << std::setfill('0') << static_cast(data2[currentOffset]) << " "; } else { std::cout << " "; } } std::cout << "\033[0m" << std::endl; // Reset color } } void HexView::printHexLine(const std::vector& data, size_t offset, size_t bytesPerLine) { for (size_t i = 0; i < bytesPerLine; i++) { size_t currentOffset = offset + i; if (currentOffset < data.size()) { std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(data[currentOffset]) << " "; } else { std::cout << " "; } } } void HexView::printAsciiLine(const std::vector& data, size_t offset, size_t bytesPerLine) { for (size_t i = 0; i < bytesPerLine; i++) { size_t currentOffset = offset + i; if (currentOffset < data.size()) { char c = data[currentOffset]; if (std::isprint(c)) { std::cout << c; } else { std::cout << "."; } } else { std::cout << " "; } } } std::string HexView::getByteColor(size_t offset, uint8_t byte) { if (highlightCallback_ && highlightCallback_(offset)) { return "\033[31m"; // Red color for differences } return "\033[0m"; // Default color }