在c ++中将4个字符转换为int

时间:2014-10-04 19:23:19

标签: c++ int arrays

我必须从文件中读取10个字节,最后4个字节是无符号整数。但我有一个11字节长的字符数组/指针。如何将最后4个字节(末尾没有零终止字符)转换为无符号整数?

//pesudo code
char *p = readBytesFromFile();
unsigned int myInt = 0;
for( int i = 6; i < 10; i++ )
    myInt += (int)p[i];

这是对的吗?对我来说似乎不正确。

4 个答案:

答案 0 :(得分:2)

我同意之前的回答,但只是想补充一点,如果文件是使用不同的字节顺序创建的,则此解决方案可能无法100%工作。

我不想让您混淆额外的信息,但请记住,当您直接从文件中投射时,字节顺序可能会导致您的问题。

这是关于字节序的教程:http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness

答案 1 :(得分:2)

以下代码可能有效:

myInt = *(reinterpret_cast<unsigned int*>(p + 6));

当且仅当:

  • 没有对齐问题(例如,在GPU内存空间,如果没有提供某些保证,这很可能会受到影响)。
  • 您可以保证系统字节顺序与用于存储数据的字节顺序相同
  • 您可以确定sizeof(int) == 4保证无处不在

如果没有,正如Dietmar建议的那样,你应该循环数据(根据字节顺序转发或反向)并执行类似

的操作
myInt = myInt << 8 | static_cast<unsigned char>(p[i])

这是对齐安全的(它应该在每个系统上)。仍然要注意第1点和第3点。

答案 2 :(得分:1)

尝试myInt = *(reinterpret_cast<unsigned int*>(p + 6));

这将获取第6个字符的地址,重新解释为指向unsigned int的指针,然后返回它指向的(unsigned int)值。

答案 3 :(得分:0)

也许使用联合是一种选择?我认为这可能有效; 更新:是的,它有效。

$(".expiry").each(function () {

        var expiry = $(this).text();

        var x = setInterval(function () {
            
            var now = new Date().getTime();
            
            var distance = expiry - now;

            var days = Math.floor(distance / (1000 * 60 * 60 * 24));
            var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
            var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
            var seconds = Math.floor((distance % (1000 * 60)) / 1000);

            $(this).closest("div").find(".countdown").html(days + "d " + hours + "h " + minutes + "m " + seconds + "s ");

        }, 1000);

    });