Вы можете использовать sscanf
для сканирования блоков памяти вместо файлов, аналогично тому, как вы можете использовать sprintf
до printf
в памяти. Прототип:
int sscanf (const char *str, const char *format, ...);
Другими словами, то же самое, что и scanf
, но с добавленным указателем.
Это для преобразования символьных данных в другие типы. Если у вас есть raw данные в этом буфере памяти, вы можете привести и отменить ссылку.
Другими словами, скажем, у вас есть буфер памяти с целым числом, начинающимся с пятой позиции (смещение 4), что-то вроде:
#include <stdio.h>
int main(void) {
// +--------------+--> little-endian,
// | | 32-bit = 42.
char xyz[] = "1234\x2a\x00\x00\x00";
int x = *((int*)(xyz+4));
printf ("%d\n", x);
return 0;
}
Предполагая, что ваша целочисленная кодировка такая же, как у меня, это выдает 42 (шестнадцатеричное 2A). Разбирая это выражение по одному биту за раз:
(xyz+4) : Get the address four unit past xyz. Since xyz is a char
pointer, this means four bytes.
(int*)(xyz+4) : Cast it into an int pointer.
*((int*)(xyz+4)) : De-reference that to get the int at that address.