#include <unistd.h> #include <stdint.h> #include <iostream> #include <fcntl.h> #include <sys/stat.h> #include <assert.h> #include <sys/mman.h> #include <sys/types.h> #include <algorithm> #include <cstring> #define INDEX_SIZE 5 // Prints if an offset is not alligned to 100B uint64_t ConvertHexToRoff(uint8_t *bytes) { uint64_t tmp = 0; for (int i = INDEX_SIZE - 1; i >= 0; --i) { tmp |= (uint64_t(bytes[i]) << i * 8); } return tmp; } int main(int argc, char** argv) { int fd = open(argv[1], O_RDWR | O_DIRECT); if (fd < 0) { printf("Couldn't open input file %s: %s\n", argv[1], strerror(errno)); exit(1); } struct stat st; stat(argv[1], &st); char* mapped_buffer = (char *)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (mapped_buffer == MAP_FAILED) { printf("Failed to mmap read file of size %lu: %s\n", st.st_size, strerror(errno)); return -1; } for(size_t idx = 0; idx < st.st_size; idx+= 15) { size_t tmp = ConvertHexToRoff((uint8_t *) (mapped_buffer + idx + 10)); if (tmp % 100) { for(int i=0; i<10; i++) printf("%x ", mapped_buffer[idx+i]); printf(" = "); for(int i =10; i< 15; i++) printf("%x ", mapped_buffer[idx+i]); printf(" = "); printf("%lu \n", tmp); } } }