我将文件大小存储在二进制文件中,我可以将此文件大小放入char[8]
缓冲区。我想将此char[]
转换为off_t
类型,以便能够将其作为truncate(const char *path, off_t length)
的参数传递。
我尝试了这种天真的方法,它似乎在大部分时间都有效,但它有时失败并且给我一个奇怪的位序列。
off_t pchar_2_off_t(char* str, size_t size)
{
off_t ret = 0;
size_t i;
for (i = 0; i < size; ++i)
{
ret <<= 8;
ret |= str[i];
}
return ret;
}
答案 0 :(得分:1)
只需批量复制相关数据:
#include <string.h> /* for memcpy() */
...
char str[8];
/* Read 8 bytes binary data into str here. */
off_t off_file;
memcpy(&off_file, str, sizeof off_file);
要解决任何持久性问题,请执行以下操作:
off_t off = ntohll(off_file); /* Assuming ntohll being the 64bit version of ntohl(). */
由于ntohll()
是非标准的,请在此处查看一些可能的实施方式:64 bit ntohl() in C++?
答案 1 :(得分:1)
ret |= str[i];
是一个问题,因为str[i]
可能会在转换为int
时签名扩展,在ret
中设置多个位。由@pmg隐含,并由@mafso
off_t pchar_2_off_t(const char* str, size_t size) {
off_t ret = 0;
size_t i;
for (i = 0; i < size; ++i) {
ret <<= 8;
ret |= (unsigned char) str[i];
}
return ret;
}
答案 2 :(得分:0)
unsigned const char blah[8] = {0xdd,0xee,0xaa,0xdd,0xbb,0xee,0xee,0xff};
off_t * scalar = (off_t *) malloc(8);
memcpy(scalar, blah, 8);
printf("%llx\n",*scalar);
输出(在我的英特尔计算机上):ffeeeebbddaaeedd
所以,如果你想以便携式方式做到这一点,你需要真正了解字节序和特殊情况,或者只是用循环转换:
*scalar = 0;
for (int i = 0; i < 8; i++)
{
*scalar += (uint64_t)blah[i] << ( 8 * (7-i));
}
printf("%llx\n",*scalar);
输出(在所有64位off_t的机器上):ddeeaaddbbeeeeff
答案 3 :(得分:-1)
假设包含filesize的文件是在EXACT同一台机器上创建的,并且它最初是用off_t
类型编写的,您只需要转换char[]
- &gt; off_t
。例如:
off_t filesize = *((off_t*)str);