字符串的二进制存储读取

问题描述:C++用CArchive类存储的文件,Unicode编码的,用C#的BinaryReader读取

现状:C#也设置为Unicode格式,C++的Int用C#的ReadInt32,C++的double用C#的ReadDouble正常读取,但是字符串碰到了问题。

分析:

1. C++中的CString存储的时候,存储为FFFEFF 然后后面是字符串的长度【Unicode一个字符占2个字节,这个长度是字符的长度】

(1)如果小于256,则为单个字节存储 FFFEFF DF 长度为DF

(2)如果大于=256,则3个字节存储 FFFEFF FF0602 长度为 256乘以02+06

2. C#中的string用ReadString读取的时候,字符串的长度是字节的长度,导致只读取了一半。所以没法直接拿来用。不知道我这个理解是不是正确呢。

(1)C#的存储如果是小于256个字节的时候,DF就是一个字节存长度

(2)如果大于=256个字节,就是,第一个位是1,E803 代表后一个字节也存储长度  长度为E8-128+128*03

解决方法:

     1.C#读取

            inReader.ReadBytes(3);
            bb1 = inReader.ReadBytes(1);

            int count = 取长度;

            s1 = System.Text.Encoding.Unicode.GetString(inReader.ReadBytes(count * 2));

       2.C#存储

          byte[] abc = new byte[]{255, 254, 255};

            inWrite.Write(abc);
            inWrite.Write((byte)s1.Length);   //如果大于128个字符,需要处理哦
            inWrite.Write(System.Text.Encoding.Unicode.GetBytes(s1));

总结:研究研究而已,没有很深入。等待验证。

      JAVA中的ReadUTF跟WriteUTF,对于字符串的长度是固定占2个字节。例如0004,0234这种



你可能感兴趣的:(C++)