从文件跨平台(de)序列化char *

时间:2011-08-23 11:36:00

标签: c cross-platform fwrite fread

我需要fwrite char *提交fread并在char签名变化的另一个平台上unsigned char*

  • 有没有办法解决这个其他而不是明确地序列化char*
  • unsigned char*投射到{{1}}?
  • 是否始终安全

3 个答案:

答案 0 :(得分:4)

这两个平台必须在某种程度上同意char的表示,以便您将文件从一个转移到另一个。

所以没有“完全可移植”的方式来做到这一点 - 例如假设char在写入的平台上是16位,而在平台上读取的是8位,那么显然你不能一般转移从一个人到另一个人。要么根本不可能这样做(16位字符表示DSP,它可能没有基于文件或流的I / O),或者有一些商定的规则如何在传输文件时转换文件。

还需要协议执行字符集是什么,或者是在(例如)EBCDIC和ASCII之间转换文件的方法。否则,在一边写a不会导致在另一边读a

一旦你建立了char在每一方面的密切关系的规则,它就会告诉你你可以读写什么。如果的差异是char的签名变化,但它们都使用相同的字符集,那么只需检查签名的字符集如何表示负值。

假设它以唯一的通用方式(二进制补码)进行,并且假设双方以唯一的通用方式从无符号整数转换为有符号整数(重新解释位模式),那么您可以只读取和写入{ {1}}通常在双方都有与charunsigned char之间的投射有效的结果。

答案 1 :(得分:1)

如果你在没有负面的情况下'序列化'char,那就没关系了。否则它没有意义(因为你将无法确定写入了哪个值)。

答案 2 :(得分:1)

在C中,可以安全地访问任何类型作为unsigned char [sizeof T];这称为表示。问题是在不同系统之间复制此表示是否会保留。以下是相关事实/问题:

  • char的所有正值(请记住,基本执行字符集中的所有字符必须为正)与具有相同值的unsigned char具有相同的表示形式。 (这同样适用于其他有符号/无符号整数类型。)
  • 在二进制补码系统中,有符号和无符号char类型是完全兼容的(以模数值的差异为模),并且以任何一种类型访问它们都是完全安全的。此外,C标准使得很难(如果不是不可能的话)生成有效的实现,其中普通char是签名而不是二进制补充,我认为可以说这种实现不存在或将永远存在。
  • 即使char(这些是整数!)在将文件传输到另一个系统时也会被保留,这并不一定意味着将保留字符标识,因为目标系统可能使用不同的字符编码(EBCDIC puke ..)。

这是一个很大的例子,但你应该带走的结果是,除非你的目标是迂腐和语言律师,否则没有什么可担心的。只需直接在字符串上使用fwritefread,就不用担心它们是unsigned char[]还是char[]字符串。