【问题标题】:Convert unsigned long to char*, disregard high 0 bytes将 unsigned long 转换为 char*,忽略高 0 字节
【发布时间】:2017-06-18 20:10:11
【问题描述】:

我有一个 unsigned long long 变量,我想将其写入二进制文件。但是,我需要忽略所有为零的前导字节。
这意味着

unsigned long long toWrite = 4;

应该将 0x04 而不是 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 写入流。

#include <fstream>
int main(){
  std::ofstream out("test.txt", std::ios::binary);
  unsigned long long toWrite = 4;
  out << cutoffZeroBytes(toWrite);
  out.close();
  return 1;
}

我正在考虑让cutoffZeroBytes 成为一个返回char* 的函数。但是如果中间有零个字节(例如 0x03 0x00 0xf1),那么我认为我无法将它写入流,因为 0x00 决定了 char 数组的结尾。 我在这里有点不知所措,需要一些帮助。

【问题讨论】:

  • 你可以返回一个 char * 和一个长度。将 char * 视为字符串只是一种约定,而不是要求。将其视为指向 char 数组的指针同样有效。不过,您不能使用 operator
  • 另外,如果值实际上是 0,你期望什么输出?
  • 最小化为单字节,解决0的问题
  • @J3STER 是的,但这不是问题所说的。
  • @J3STER 我认为山姆的回答是合理的。

标签: c++ binary fstream


【解决方案1】:

一种方法是为此目的使用 write。 所以,只需改变:

out << cutoffZeroBytes(toWrite);

到:

out.write((char*)&toWrite, sizeof(toWrite));

如果你想减少这个数字:

char* start = (char*)&toWrite;
int pi = sizeof(toWrite);
for (; pi > 0; pi--, start++)
    if (*start)
        break;
out.write(start, pi);

【讨论】:

  • 这将如何切断任何前导 0?
  • 我认为这不会改变我试图说明的要点。我不是在做功课,我是在指导。 :) 我认为你可以从那里开始合理地调整它。
  • 一种更便携的方法(并且不依赖于字节序),是隔离最低有效字节:uint8_t byte = (uint8_t)(toWrite &amp; 0xFFU); out.write(&amp;byte, 1);
  • 如果 toWrite 小于 1 字节,这可能是一个很好的解决方案。但这并不普遍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2018-02-05
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多