From ab69e5e2a7694c5847a235f968e0bc0d65e655ec Mon Sep 17 00:00:00 2001 From: Avril Date: Sun, 15 Nov 2020 22:05:28 +0000 Subject: [PATCH] u64_to_hex --- include/hex.hpp | 35 +++++++++++++++++++++++++++++++++++ src/hex.cpp | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/include/hex.hpp b/include/hex.hpp index 50a2c2f..aacfa97 100644 --- a/include/hex.hpp +++ b/include/hex.hpp @@ -5,4 +5,39 @@ namespace hv { /// Print a single screen void print_screen(const span bytes, unsigned long offset); + + inline void lookup_hex_string(std::uint64_t x, char* s) + { + static const char digits[513] = + "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + int i = 7; + const char *lut = (const char *)digits; + while (i >= 0) + { + int pos = (x & 0xFF) * 2; + char ch = lut[pos]; + s[i * 2] = ch; + + ch = lut[pos + 1]; + s[i * 2 + 1] = ch; + + x >>= 8; + i -= 1; + } + } } diff --git a/src/hex.cpp b/src/hex.cpp index 4e099bc..b314264 100644 --- a/src/hex.cpp +++ b/src/hex.cpp @@ -1,5 +1,6 @@ #include #include +#include const static constexpr char ascii_map[256] = { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', @@ -71,6 +72,22 @@ inline __attribute__((always_inline)) void print_exact(const char (&ar)[N]) fwrite(ar, N, 1, stdout); } +inline static void u64_to_hex(std::uint64_t num, char* s) +{ + hv::lookup_hex_string(num, s); +#if 0 + std::uint64_t x = num; + x = ((x & 0xFFFF) << 32) | ((x & 0xFFFF0000) >> 16); + x = ((x & 0x0000FF000000FF00) >> 8) | (x & 0x000000FF000000FF) << 16; + x = ((x & 0x00F000F000F000F0) >> 4) | (x & 0x000F000F000F000F) << 8; + + uint64_t mask = ((x + 0x0606060606060606) >> 4) & 0x0101010101010101; + x += 0x27 * mask; + + *(uint64_t *)s = x; +#endif +} + namespace hv { void print_screen(const span memory, unsigned long offset) { @@ -82,7 +99,17 @@ namespace hv { #define S #define P_EX(n, buf) print_exact(buf) #endif - fmt::print("0x{:016x} ", offset); + char posbuf[3 + 16 + 2] = { '0' }; + posbuf[0] = '\n'; + posbuf[1] = '0'; + posbuf[2] = 'x'; + + posbuf[3 + 16] = ' '; + posbuf[3 + 16 + 1] = ' '; + + u64_to_hex(offset, posbuf+3); + prints(posbuf+1); + char hxbuf[3]; std::size_t i=0; char r_ascii[2 + ROW_SZ]; @@ -94,11 +121,14 @@ namespace hv { for(;i