char* 和 unsigned char* 的转换

4

我需要在我的程序中读写二进制数据。经过一些研究,似乎使用无符号字符数组来存储数据是一个不错的选择。

我使用ios::binary标志以二进制模式打开文件,但是当我要进行读取或写入操作时,ifstream::read()和ofstream::write()函数期望接收一个char*和const char*类型的参数。

因此,每次我想要进行读写操作时,都必须将无符号字符指针转换为char*。

我认为这不会有任何区别,但我开始怀疑是否应该只使用常规的char数组来存储数据。我看到有人用char数组和无符号char数组来完成此任务,但我并不完全了解它们之间的区别。

假设我有两个数组:

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数组哪个更好呢?


1
文件/二进制读取接口通常使用char*作为“指向字节的指针”的首选类型,这是很正常的。在您的情况下,将字节读入unsigned char[]是完全安全的,将其转换为char*也是完全安全的。您应该使用reinterpret_cast来明确表示您只是暂时将数组视为char*而不是unsigned char[20] - GManNickG
1个回答

0

有符号字符通常被认为是保存文本数据的,而无符号字符则表示一个字节,不一定是ASCII值。因此,约定使用无符号字符来处理二进制数据,因为char是否带符号取决于实现。

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


2
标准文件函数强制你使用 char,即使 unsigned char 可能更方便。 - Neil Kirk
char 不一定是有符号的。 - Nicol Bolas
1
basic_ifstream允许您使用其他字符类型,但这并不一定比转换为char*更好的解决方案。 - adisib
char通常表示文本。unsigned char通常表示原始字节。signed char则相对不太常用,一般表示较小的整数。 - Martin Bonner supports Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接