This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.idea
|
||||||
|
.vs
|
||||||
|
.vscode
|
||||||
|
build
|
||||||
44
CMakeLists.txt
Normal file
44
CMakeLists.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
|
project(numa VERSION 0.0.0 LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
set(INSTALL_DIR "/usr/local" CACHE PATH "installation directory")
|
||||||
|
option(BUILD_SHARED_LIBS "build as shared library" OFF)
|
||||||
|
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
set(SOURCE_FILES numa.c)
|
||||||
|
set(HEADER_FILES numa.h)
|
||||||
|
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
|
||||||
|
else()
|
||||||
|
add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS ${PROJECT_NAME}
|
||||||
|
LIBRARY DESTINATION ${INSTALL_DIR}/lib
|
||||||
|
ARCHIVE DESTINATION ${INSTALL_DIR}/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES ${HEADER_FILES} DESTINATION ${INSTALL_DIR}/include)
|
||||||
|
|
||||||
|
message(STATUS "")
|
||||||
|
message(STATUS "===== numa configuration summary =====")
|
||||||
|
message(STATUS "library name: ${PROJECT_NAME}")
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
message(STATUS "library type: shared")
|
||||||
|
else()
|
||||||
|
message(STATUS "library type: static")
|
||||||
|
endif()
|
||||||
|
message(STATUS "install directory: ${INSTALL_DIR}")
|
||||||
|
message(STATUS "======================================")
|
||||||
|
message(STATUS "")
|
||||||
47
README.md
Normal file
47
README.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Numa Library
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Numa Library is a lightweight C library that provides functionality to generate hexadecimal dumps of binary data. It's designed to be easy to use, efficient, and flexible.
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- Customizable output format
|
||||||
|
- Support for different grouping sizes (1, 2, 4, or 8 bytes)
|
||||||
|
- ASCII representation alongside hex output
|
||||||
|
- Configurable number of bytes per row
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Prerequisities
|
||||||
|
|
||||||
|
- CMake (version 3.10 or higher)
|
||||||
|
- A C compiler (supporting C99 standard)
|
||||||
|
|
||||||
|
|
||||||
|
### Building the Library
|
||||||
|
|
||||||
|
1. For the default static library build
|
||||||
|
```shell
|
||||||
|
cmake -B build
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
2. To build a shared library:
|
||||||
|
```shell
|
||||||
|
cmake -B build -DBUILD_SHARED_LIBS=ON
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installing the Library
|
||||||
|
|
||||||
|
To install the library to the default location (/usr/local):
|
||||||
|
```shell
|
||||||
|
sudo cmake --install build
|
||||||
|
```
|
||||||
|
|
||||||
|
To specify a custom installation directory:
|
||||||
|
```shell
|
||||||
|
cmake -B build -DINSTALL_DIR=/usr
|
||||||
|
cmake --build build
|
||||||
|
cmake --install build
|
||||||
|
```
|
||||||
55
numa.c
Normal file
55
numa.c
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include "numa.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
void numa(const uint8_t *data, uint32_t length, uint16_t width, uint8_t bytes) {
|
||||||
|
uint32_t i, j;
|
||||||
|
for (i = 0; i < length; i += width) {
|
||||||
|
printf("%08x: ", i);
|
||||||
|
|
||||||
|
for (j = 0; j < width; j += bytes) {
|
||||||
|
if (i + j < length) {
|
||||||
|
switch (bytes) {
|
||||||
|
case 1: printf("%02x ", data[i + j]); break;
|
||||||
|
case 2:
|
||||||
|
if (i + j + 1 < length)
|
||||||
|
printf("%04x ", *((uint16_t *)(data + i + j)));
|
||||||
|
else
|
||||||
|
printf("%02x ", data[i + j]);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (i + j + 3 < length)
|
||||||
|
printf("%08x ", *((uint32_t *)(data + i + j)));
|
||||||
|
else {
|
||||||
|
for (int k = 0; k < 4 && i + j + k < length; k++)
|
||||||
|
printf("%02x", data[i + j + k]);
|
||||||
|
printf("%*s", 2 * (4 - (length - (i + j))), "");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (i + j + 7 < length)
|
||||||
|
printf("%016lx ", *((uint64_t *)(data + i + j)));
|
||||||
|
else {
|
||||||
|
for (int k = 0; k < 8 && i + j + k < length; k++)
|
||||||
|
printf("%02x", data[i + j + k]);
|
||||||
|
printf("%*s", 2 * (8 - (length - (i + j))), "");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unsupported byte width\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("%*s", bytes * 2 + 1, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print ASCII representation
|
||||||
|
printf(" | ");
|
||||||
|
for (j = 0; j < width && i + j < length; ++j) {
|
||||||
|
uint8_t byte = data[i + j];
|
||||||
|
printf("%c", isprint(byte) ? byte : '.');
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
21
numa.h
Normal file
21
numa.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief prints a hexadecimal dump of the given data
|
||||||
|
*
|
||||||
|
* This function prints offset, hexadecimal representation, and ASCII representation.
|
||||||
|
*
|
||||||
|
* @param data pointer to the input data buffer
|
||||||
|
* @param length length of the input data in bytes
|
||||||
|
* @param width number of bytes to display per row
|
||||||
|
* @param bytes number of bytes to group together (1, 2, 4, or 8)
|
||||||
|
*
|
||||||
|
* @note The function supports grouping bytes in 1, 2, 4, or 8 byte chunks.
|
||||||
|
* For multi-byte groupings, the data is interpreted as little-endian.
|
||||||
|
*
|
||||||
|
* @warning if an unsupported byte width is provided, the function will print
|
||||||
|
* an error message to stderr and return without processing the data
|
||||||
|
*/
|
||||||
|
void numa(const uint8_t * data, uint32_t length, uint16_t width, uint8_t bytes);
|
||||||
Reference in New Issue
Block a user