【问题标题】:c++ creating 4 integer from the 16 byte char arrayc++ 从 16 字节字符数组中创建 4 个整数
【发布时间】:2014-06-17 08:40:31
【问题描述】:

这是我的问题

我已将二进制文件中的二进制序列读入 char 数组。我的二进制文件比我的缓冲区大得多,所以我反复阅读它。

我已经从文件中读取了 16 个字节并将其存储到 char * myPointer 指针中。现在从 myPointer 我需要创建 4 个整数,但我不知道该怎么做。有没有人可以帮助我?

注意:如果您有更好的解决方案,我不必将其存储到 char 数组中

【问题讨论】:

  • 你说的“创建”是什么意思?你打算怎么处理他们?
  • @Michael 我要做什么重要吗?使用数组的前 4 个字节,我想创建第一个 itneger,依此类推
  • 你可以直接从源代码读取到int(假设std::ifstream file;):int i = 0; file.read((void*)&i, sizeof(i));
  • @VioletGiraffe 我的文件是二进制文件,我需要初始化一些 4 字节 int 有时很短。没有问题吗?如果没有,你能写出你的意思吗?
  • char* 转换为intchar * data; int i1 = 0, i2 = 0; i1 = *(int*)data; i2 = *(int*)(data+sizeof(int)); 等等。

标签: c++ pointers integer binaryfiles


【解决方案1】:

如果存储数据的字节序与您系统的字节序相同,那么您可以使用以下代码将读取的数据存储在int

int ints[4];
char bytes[4*sizeof(int)];
memcpy( ints, bytes, sizeof( ints ) );

如果您在输入二进制文件和您的计算机上有不同的字节序,您可能需要交换位:

template< class T>
void changeEndianess( T & input)
{
    char temp[ sizeof( T ) ];
    for( int j=sizeof( T )-1; j>=0; --j )
        temp[sizeof(T)-j-1] = *((char *)&input+j);
    memcpy( &input, temp, sizeof( T ) );
}

// and somewhere in your program:
for( size_t i=0; i<sizeof( ints ); ++i )
{
    changeEndianess<int>( ints[i] );
}

要使其使用short,请将上述代码中的所有int 更改为short,但何时需要由您决定。

【讨论】:

  • @Lukasz_Daniluk 正如我上面所说的,我并不总是将其存储为整数,有时我也需要将其存储为短格式
  • 这段代码实现得很差memcpymemcpy(ints, bytes, sizeof ints);。完成。
  • @MaximYegorushkin: 是的,memcpy 的作用相同,而且更短。
  • 我建议使用一个专用的字节交换函数,而不是这种内部的... ...
  • 交换字节顺序 ntoh[ls] 家庭功能可能会有所帮助。
【解决方案2】:

从二进制文件中读取:

#include <fstream>
#include <assert.h>

void main()
{
    std::ifstream file("file.dat", std::ios_base::binary);
    assert(file.is_open());

    int i = 0;
    file.read((void*)&i, sizeof(i));
    short s = 0;
    file.read((void*)&s, sizeof(s));

    ... // And so on
}

显然,您需要确切地知道如何解释数据,即。 e.文件结构(哪种数据类型写在哪里)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多