目录
问题缘由
背后原理
(资料图片仅供参考)
C#代码示例
总结
由于公司需求,需要读取游戏Redis数据做内外网数据迁移,没有与游戏组过多的沟通。 使用的数据类型是Hash, key是string,value是byte[]。以前对于编码的理解是:计算机底层存储的永远是01的二进制数据,编码是一种对于计算机二进制数据的字符映射,也就是约定好哪个值对应哪个字符。是为了便于在显示器上展示。
那么基于这个理解,我就以为 不需要关心存储的数据类型,因为我不需要用到数据,我只是负责做数据的搬运。于是我用的是HGetAsync方法去读的字符串。然后HSetAsync把数据存到另一个Redis。结果发现数据发生了编码。基于我上边对于编码的理解,也就是按照不同的编码读取字符串,只是显示器上会乱码,但是底层的01二进制没有发生变化,这次问题打破了我的认知。
背后原理当一个byte[]在计算机中存储时,它就是以二进制形式保存的。如果这个byte[]中的每一个字节代表的是ASCII码(一个字节表示一个字符),那么它在不同的编码下读取应该没有问题。但是,如果它代表的是Unicode字符集(UTF-8和UTF-16等),那么在不同的编码下读取就会发生问题。因为不同的编码方式对存储方式和字节长度都有不同的要求。
以UTF-8为例,它对不同字符分配的位数不同。对于ASCII字符,UTF-8使用一个字节表示,而对于其他字符,它需要两个字节、三个字节或四个字节来表示。因此,在按照UTF-8格式读取一个byte[]时,如果它的编码确实是UTF-8,那么就可以读取正确的字符。但是,如果重新以UTF-8的格式存储它时,就会按照UTF-8的编码方式重新把这个字符转换成二进制。如果这个字符之前的编码不是UTF-8,那么它在转换为UTF-8的二进制时,就会变成不同的值,因此数据也就变了。
C#代码示例var data = Encoding.UTF32.GetBytes("爱");var word = Encoding.UTF8.GetString(data);var word1 = Encoding.UTF32.GetString(data);File.WriteAllText($@"{AppDomain.CurrentDomain.BaseDirectory}/code.txt", word);File.WriteAllText($@"{AppDomain.CurrentDomain.BaseDirectory}/code1.txt", word1);foreach (var d in File.ReadAllBytes($@"{AppDomain.CurrentDomain.BaseDirectory}/code.txt")){ Console.WriteLine(d);}Console.WriteLine("------------");foreach (var d in File.ReadAllBytes($@"{AppDomain.CurrentDomain.BaseDirectory}/code1.txt")){ Console.WriteLine(d);}
例如,我们有一个Unicode字符“爱”,其二进制表示为:0000 0100 1110 0111。按照UTF-8编码的规则,在存储这个字符时,我们需要使用3个字节的二进制数据:1110XXXX 10XXXXXX 10XXXXXX(X表示对应字符的二进制数据的高位)
我们将其存储到一个byte[]中,再将其存储到文件中。然后按照UTF-8的格式读取,解析出Unicode字符“爱”,再将其按照UTF-8的格式存储回文件。这时,由于使用了UTF-8编码,我们需要将Unicode字符“爱”转换为UTF-8编码的二进制数据,即,使用3个字节的二进制数据:11100100 10101110 10011111。
通过运行代码,可以看到,由于存储使用了UTF-8编码,而读取和重新存储又使用了UTF-8编码,因此二进制数据发生了变化。
总结当一个byte[]在计算机中存储时,它就是以二进制形式保存的。如果这个byte[]中的每一个字节代表的是ASCII码(一个字节表示一个字符),那么它在不同的编码下读取应该没有问题。但是,如果它代表的是Unicode字符集(UTF-8和UTF-16等),那么在不同的编码下读取就会发生问题。
标签:
目录问题缘由背后原理C 代码示例总结问题缘由由于公司需求,需要读取游戏Redis数据做内外网数据迁移,没
可以。牛尾200克、西瓜酱10克、黄花菜100克、海带100克、木耳20克、腐竹50克、葱姜、胡椒粉、料酒、酱油、
想必现在有很多小伙伴对于磨泥打蜡和抛光打蜡的区别是什么方面的知识都比较想要了解,那么今天小好小编就为
广西新闻网防城港6月1日讯(通讯员蒙丽燕)日前,为期一个多月的2023年“潮动三月三民族体育炫”防城港...
恭喜我们破厂的“自家孩子”洛特入选英格兰国家队,征战女足世界杯!冬窗离队的12年枪手乔丹·诺布斯也...
不过市场狂热的背后,一部分所谓的相关概念股到底有没有相关技术,是不是真正拥有“脑机接口”业务成为...
B站150万UP主赚到钱了!正式会员突破2亿
老公不向着自己,婆家无视她的付出,这也导致她对婆家人心存芥蒂,宋丹丹同时也演出了吴二琥的无奈与心酸。
美国主导的“印太经济框架”日前基本完成“提高供应链韧性与安全”的协议谈判。这份协议旨在建立“排除...
奥飞娱乐涨9 97%机构净买入5271万元
想必现在有很多小伙伴对于下面图中S8550作用是什么功率放大还是什么放大方面的知识都比较想要了解,那么今
音频解说一、贵州省遵义市天气预报1、湄潭县气象台2023年06月01日11时57分发布雷电黄色预警信号。2、预计未来3小
近日,有观众反映:自己花千元购买梁静茹上海演唱会的门票,到场后发现,视野被舞台四周的立柱遮挡,看歌手
中国青年报客户端北京5月31日电(中青报·中青网记者张均斌)萌宠互动、亲子运动、户外研学……“六一”...
津南区(不含海教园)户籍学生2023-2024学年秋季学期小学转学时间网上登记时间:2023年6月1日10:00-2023年6月3
律师你好,我想咨询下我朋友倒车不小心碰到了一位老人,导致盆骨骨折
在今年的Computex2023上,微星展出了不少的产品。除了带来名为“GeForceRTX4060VENTUS
外电5月31日消息,德国商业银行表示,预计2023年底铜价为每吨9,000美元,2024年底为9,4
6月1日10点55分,文化传媒板块指数报9494 153点,涨幅达4%,成交296 61亿元,换手率2 49%。板块个股中,涨
为切实提升信用服务水平,今年5月份起,鹤壁市在全国率先建立并实施信用信息“四书同达”助企服务机制。...