如何使用printf函数添加连续字节的数字以显示整数?

时间:2017-03-13 22:04:52

标签: c printf

我试图在屏幕上为我正在阅读的文件打印连续的字节。正在.vdi文件中读取的文件,我试图以printf格式显示虚拟驱动器的大小。

如何显示文件中读取字节值的整数值?

我仍然对C如何使用printf函数感到模糊。我的代码:

void get_file_size(u32 fd) {
    u8* HDDsize = (u8 *)malloc(8);

    if(HDDsize == NULL) {
        printf("Memory not allocated!");
    }

    lseek(fd,DRIVE_SIZE,SEEK_SET);
    read(fd,HDDsize,8);
    printf("The file system size is: %lli\n",
            HDDsize[7]+HDDsize[6]+HDDsize[5]+HDDsize[4]+
            HDDsize[3]+HDDsize[2]+HDDsize[1]+HDDsize[0]);
    free(HDDsize);
}

2 个答案:

答案 0 :(得分:0)

您正在做的只是将所有这些字节的值相加,然后打印结果总和。 由于这些字节在数组中,因此它们在内存中是连续的,您可以尝试这样的事情:

long long number = *((long long*)HDDSize);

因此它会将这8个字节看作长long变量。 它可能会向后显示它(所以你需要反转那个数组)。

答案 1 :(得分:0)

要打印存储在little endian中的4字节值(最低地址中的最低有效字节),代码需要缩放每个字节,而不是简单地添加它们。每个字节比相邻字节重256倍。使用:

#include <stdint.h>
#include <stdio.h>

void Print_Size4(int fd) {
  uint8_t HDDsize[4];

  if (lseek(fd, DRIVE_SIZE,SEEK_SET) == -1) return;
  if (read(fd, HDDsize, sizeof HDDsize) != sizeof HDDsize) return;

  printf("The file system size is: %lu\n",
      //                 LU --> insure all math is at least of unsigned long
      (((HDDsize[3] * 256LU + HDDsize[2]) * 256 + HDDsize[1]) * 256 + HDDsize[0]));
}

最好使用标准的固定类型,例如uint8_t而不是u8。 <{1}}不需要。

我将把它留给OP来制作一个8字节的单行解决方案。提示:也可以使用malloc()LLU数学。

也许使用循环。

uint64_t

研究uint64_t size = 0; for (unsigned i=sizeof HDDsize; i>0; i--) { size = size*256 + HDDsize[i-1]; } 以找到<inttypes.h> .的最佳printf()格式说明符