如何将4字节无符号整数写入二进制

时间:2014-12-02 12:21:24

标签: c++ io

试图找出如何将无符号整数写入二进制文件。我认为整数不应该占用4个字节以上的空间。我在下面的代码中有两部分标记为 Write v.1 Write v.2 。预期的行为将是两个都可以工作,但只有版本2,但它占用更多的空间,然后我认为它应该。

问题

如何将无符号整数写入4字节的二进制文件?如果不可能,请解释原因为何?
如何在版本1中读取和输出无符号整数。

代码

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
  unsigned int x = 4294967295;
  ofstream outfile;
  streampos begin,end;
  ifstream myfile;
  streampos size;
  char * memblock;

  // Write v.1
  outfile.open("example.bin", ios::binary | ios::out | ios::trunc);
  outfile.write((char*)&x, sizeof(unsigned int));
  outfile.close();

  // Output size
  myfile.open ("example.bin", ios::binary | ios::in);
  begin = myfile.tellg();
  myfile.seekg (0, ios::end);
  end = myfile.tellg();
  cout << "size is: " << (end-begin) << " bytes.\n";

  // Output content
  size = myfile.tellg();
  memblock = new char[size];
  myfile.seekg (0, ios::beg);
  myfile.read (memblock, size);
  myfile.close();

  cout << "content: " << memblock << "\n";

  delete[] memblock;

  myfile.close();

  // Write v.2
  outfile.open("example.bin", ios::binary | ios::out | ios::trunc);
  outfile << x;
  outfile.close();

  // Output size
  myfile.open ("example.bin", ios::binary | ios::in);
  begin = myfile.tellg();
  myfile.seekg (0, ios::end);
  end = myfile.tellg();
  cout << "size is: " << (end-begin) << " bytes.\n";

  // Output content
  size = myfile.tellg();
  memblock = new char[size];
  myfile.seekg (0, ios::beg);
  myfile.read (memblock, size);
  myfile.close();

  cout << "content: " << memblock << "\n";

  delete[] memblock;
}

输出

size is: 4 bytes.
content: ����
size is: 10 bytes.
content: 4294967295

2 个答案:

答案 0 :(得分:2)

您必须定义二进制文件的格式,然后转换 你的整数。典型的网络格式是 big-endian,所以你会使用类似的东西:

void
toBuffer( unsigned int value, std::vector<char>& buffer )
{
    buffer.push_back((value >> 24) & 0xFF);
    buffer.push_back((value >> 16) & 0xFF);
    buffer.push_back((value >>  8) & 0xFF);
    buffer.push_back((value      ) & 0xFF);
}

用类似的东西从缓冲区中提取它 读。 (显然,我忽略了很多错误处理。)你 可以使用std::ostream::writestd::istream::read来撰写 并读取缓冲区(假设文件已以二进制文件打开) 模式,并充满了“C”语言环境。)

但是,当然,您可能需要或需要不同的二进制格式。

答案 1 :(得分:1)

V1。 - 你写成二进制 - 读入数组 - 打印为字符串
问题在于读取数据的呈现,因为原始数据表示为以字符串形式的空终止数组。

unsigned int content;
outfile.read((char*)&content, sizeof(unsigned int));

然后内容不再是字符数组,而是序列化为int