我试图在屏幕上为我正在阅读的文件打印连续的字节。正在.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);
}
答案 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()
格式说明符