将char []转换为off_t

时间:2015-02-07 15:11:17

标签: c++ c file char type-conversion

我将文件大小存储在二进制文件中,我可以将此文件大小放入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;
}

4 个答案:

答案 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

什么是什么?!你说....这种方法存在问题,而且它不可移动......这是endianness的一个问题......

所以,如果你想以便携式方式做到这一点,你需要真正了解字节序和特殊情况,或者只是用循环转换:

*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);