【问题标题】:char* and unsigned char* castingchar* 和 unsigned char* 强制转换
【发布时间】:2016-03-26 20:14:12
【问题描述】:

我需要在我的程序中读写二进制数据。在做了一些研究之后,似乎 unsigned char 数组可能是存储数据的好选择。

我使用 ios::binary 标志以二进制模式打开文件,但是当我去读取或写入时,ifstream::read() 和 ofstream::write() 函数需要一个 char* 和 const char *.

所以,每次我想读或写时,我都必须将我的 unsigned char* 转换为 char*。

我认为这不会产生任何影响,但我开始怀疑是否应该只使用常规 char 数组来存储数据。我看到人们为此目的同时使用 char 和 unsigned char 数组,但我并不完全理解其中的区别。

假设我有 2 个数组:

char a[20];
unsigned char b[20];

现在我以二进制模式打开一个文件并读取:

file.read(a, 20);
file.read((char*)b, 20);

现在我想将此数据写入一个新文件,因此我再次以二进制模式打开:

newfile.write(a, 20);
newfile.write((char*)b, 20);

有什么区别?对于二进制数据,我最好只使用 char 数组而不是 unsigned char 数组吗?

【问题讨论】:

  • 文件/二进制读取接口使用char*作为“指向字节的指针”的类型是正常的。在您的情况下,将字节读入unsigned char[] 是非常安全的,而转换为char* 也是非常安全的。您应该使用reinterpret_cast 来表明您只是暂时将数组视为char* 而不是unsigned char[20]

标签: c++ linux g++ binary-data


【解决方案1】:

有符号字符通常被认为保存文本数据,而无符号字符表示一个字节,不一定是 ASCII 值。然后约定是对二进制数据使用 unsigned char,因为 char 是否有符号取决于实现。

您为数据选择的数据类型应该会影响您使用的函数,而不是相反。

【讨论】:

  • 标准文件函数强制您使用char,尽管unsigned char 可能更方便。
  • char 不一定是签名的。
  • basic_ifstream 允许您使用其他字符类型,但它不一定是比转换为 char* 更好的解决方案。
  • char 通常是文本。 unsigned char 通常是原始字节。 signed char 不寻常,是一个小整数。
猜你喜欢
  • 2011-10-19
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2013-07-21
  • 2013-09-27
相关资源
最近更新 更多