问题描述: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这种