#include #include #include #include int hex_char_to_int(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return -1; } int main() { // Extract EXI data starting from offset 0x0052 (after "80 98 02") // The complete EXI data from the hex dump const char* hex_string = "8098021050908c0c0c0e0c50d10032018600a01881ae0601860c806140c801030800006100001881980600"; size_t hex_len = strlen(hex_string); if (hex_len % 2 != 0) { printf("Error: Hex string length must be even\n"); return -1; } size_t binary_len = hex_len / 2; unsigned char* binary_data = malloc(binary_len); if (!binary_data) { printf("Memory allocation failed\n"); return -1; } // Convert hex string to binary for (size_t i = 0; i < binary_len; i++) { int high = hex_char_to_int(hex_string[i * 2]); int low = hex_char_to_int(hex_string[i * 2 + 1]); if (high == -1 || low == -1) { printf("Invalid hex character at position %zu\n", i * 2); free(binary_data); return -1; } binary_data[i] = (high << 4) | low; } // Write to file FILE* file = fopen("test2.exi", "wb"); if (!file) { printf("Cannot create output file\n"); free(binary_data); return -1; } size_t written = fwrite(binary_data, 1, binary_len, file); fclose(file); free(binary_data); if (written != binary_len) { printf("Write error\n"); return -1; } printf("Successfully created test2.exi with %zu bytes\n", binary_len); // Show first few bytes for verification printf("First 16 bytes: "); FILE* verify = fopen("test2.exi", "rb"); if (verify) { for (int i = 0; i < 16 && i < binary_len; i++) { int c = fgetc(verify); printf("%02X ", c); } fclose(verify); } printf("\n"); return 0; }