十六进制查找和替换 [英] Hexadecimal find and replace
问题描述
如何在二进制文件中更改二进制文件的十六进制字符?
How to change a binary file hexadecimal character in a binary file?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define BUFFER_SIZE 4096
int main(void)
{
uint8_t *buffer; // Explicit 8 bit unsigned, but should equal "unsigned char"
FILE *file;
char filename[512] = "test.bin";
// We could also have used buffer[BUFFER_SIZE], but this shows memory alloc
if (NULL == (buffer = malloc(BUFFER_SIZE)))
{
fprintf(stderr, "out of memory\n");
return -1;
}
// Being inside a { }, crlf won't be visible outside, which is good.
char *crlf;
if (NULL != (crlf = strchr(filename, '\n')))
*crlf = 0x0;
if (NULL == (file = fopen(filename, "rb")))
{
fprintf(stderr, "File not found: '%s'\n", filename);
return -1;
}
while(!feof(file) && !ferror(file))
{
size_t i, n;
if (0 == (n = (size_t)fread(buffer, sizeof(uint8_t), BUFFER_SIZE, file)))
if (ferror(file))
fprintf(stderr, "Error reading from %s\n", filename);
// Here, n = 0, so we don't need to break: next i-cycle won't run
for (i = 0; i < n; i++)
{
printf("%02X ", buffer[i]);
if (15 == (i % 16))
printf("\n"); // Every 16th byte, a newline
}
}
fclose(file); // file = NULL; // This ensures file won't be useable after fclose
free(buffer); // buffer = NULL; // This ensures buffer won't be useable after free
printf("\n");
return 0;
}
阅读十六进制=00 EB 00 00 50 E3 02
替换hex =00 EB 01 00 37 E3 02
reading hex = "00 EB 00 00 50 E3 02" replace hex = "00 EB 01 00 37 E3 02"
推荐答案
首先,一些命名法,您不希望更改文件中的十六进制字符,而是更改字节缓冲区中的字节,然后以十六进制格式打印出来。
First, a bit of nomenclature, viz nitpicking: You don't want to change the hexadecimal characters in a file, but the bytes in a byte buffer, which you then print out in hexadecimal format.
如果你的数据是 chars
,你可以使用 string.h $ c中的
strstr
$ c>找到你的指针,然后用 memcpy
的长度相同的字符串覆盖那里的数据。您需要一个类似的函数来查找可能包含字节数组中的零的任何数据。 GNU有 memmem
,但它是非标准的,所以让我们写一个:
If your data were chars
, you could use strstr
from string.h
to find your needle and then overwrite data there with a string of the same length with memcpy
. You need a similar function that finds any data which may contain zeros in a byte array. GNU has memmem
, but it is non-standard, so let's write one:
/*
* Find needle of length len in byte haystack [p, end).
*/
uint8_t *buf_find(uint8_t *p, uint8_t *end, uint8_t *needle, int len)
{
end = end - len + 1;
while (p < end) {
if (memcmp(p, needle, len) == 0) return p;
p++;
}
return NULL;
}
您可以
You can the
uint8_t what[] = {0x00, 0xEB, 0x00, 0x00, 0x50, 0xE3, 0x02};
uint8_t repl[] = {0x00, 0xEB, 0x01, 0x00, 0x37, 0xE3, 0x02};
char *p = buffer;
char *end = buffer + n;
for (;;) {
uint8_t *q = buf_find(p, end, what, sizeof(what));
if (q == NULL) break;
memcpy(q, repl, sizeof(repl));
p = q + sizeof(text);
}
这不会捕获位于4096字节块的边界处的针你当然读了。您可以通过读取整块文件或者通过一些聪明的块管理来读取这些文件,这样您就可以扫描前一个块的最后七个字节。
This will not catch needles that sit at the boundaries of the 4096-byte chunks you read in, of course. You can catch these by reading the whole file in a monolithic chunk or by some clever chunk management that allows you to scan the last seven bytes of the previous chunk.
这篇关于十六进制查找和替换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!