char 数组中的字节如何表示整数?

Ale*_*lex 1 c io

假设我有从二进制文件(如 ext2 格式的文件系统图像文件)读取的 char 数组。

现在我需要读取从偏移字节 1024 开始的整数(<--这是从数据开始的偏移量)。有什么巧妙的方法可以做到这一点吗?该整数可以是任何数字。所以我相信在我的系统(x86-64)上可以用 4 字节的整数大小来表示。

我相信我需要使用 strtol ,例如:

/* Convert the provided value to a decimal long */
char *eptr=malloc(4);// 4 bytes becuase sizeof int is 4 bytes
....
int valread=read(fd,eptr,4);//fd is to ext2 formatted image file (from file system)
result = strtol(eptr, &v, 10);
Run Code Online (Sandbox Code Playgroud)

上面是long那么这个数字是代表32位整数吗?

应该eptr以 null 终止吗?

这是否正确?

chu*_*ica 6

我有从二进制文件(如ext2格式的文件系统图像文件)读取的 char 数组。

以二进制模式打开文件

const char *file_name = ...;
FILE *infile = fopen(file_name, "rb");  // b is for binary
if (infile == NULL) {
  fprintf(stderr, "Unable to open file <%s>.\n", file_name);
  exit(1);
}
Run Code Online (Sandbox Code Playgroud)

我需要读取从偏移字节 1024 开始的整数...

long offset = 1024; 
if (fseek(infile, offset, SEEK_SET)) {
  fprintf(stderr, "Unable to seek to %ld.\n", offset);
  exit(1);
} 
Run Code Online (Sandbox Code Playgroud)

所以我相信在我的系统上可以用 4 字节的整数大小来表示

不要使用可能int与 4 字节不同的 use ,而是考虑int32_tfrom <stdint.h>

int32_t data4;
if (fread(&data4, sizeof data4, 1, infile) != 1) {
  fprintf(stderr, "Unable to read data.\n");
  exit(1);
} 
Run Code Online (Sandbox Code Playgroud)

字节序

由于文件数据是小端字节序,因此转换为本机字节序。看#include <endian.h>

data4 = le32toh(data4);
Run Code Online (Sandbox Code Playgroud)

完成后清理干净

// Use data4

fclose(infile);
Run Code Online (Sandbox Code Playgroud)

相信我需要使用strtol

No. strtol()检查一个字符串并返回一个long。文件数据是二进制的而不是字符串。