C#字符串字节的获取
2022/2/11 22:14:33
本文主要是介绍C#字符串字节的获取,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
今天偶然发现一个问题——字符串字节获取的方式不同会导致获取的结果不一样。
定义如下方法,用于获取字符串的字节:
1 static byte[] GetBytes(string data) 2 { 3 using (MemoryStream ms = new MemoryStream()) 4 { 5 using (BinaryWriter bw = new BinaryWriter(ms)) 6 { 7 bw.Write(data); 8 9 } 10 return ms.ToArray(); 11 } 12 }
以下方式也可以获取字符串对应的字节:
1 UTF8Encoding encoding = new UTF8Encoding(); 2 int len1 = encoding.GetBytes(name).Length;
测试:
1 static void Main(string[] args) 2 { 3 string name = "123"; 4 5 UTF8Encoding encoding = new UTF8Encoding(); 6 int len1 = encoding.GetBytes(name).Length; 7 8 int len2 = GetBytes(name).Length; 9 10 Console.WriteLine($"len1 = {len1} \n\nlen2 = {len2}"); 11 12 Console.ReadKey(); 13 }
输出:
值不一样,为什么?
BinaryWriter 并没有正常地写入string的二进制,而是加了点额外的信息,这在严格要求字节正确的场景下会出问题,如http请求体,服务器会对这些多出来的字节表示懵逼。前面多出来的字节实际上是表示string的长度,叫长度前缀(length-prefixed)MSDN,据SO某答主的说法,这是供BinaryReader的ReadString方法用,知道长度,它才知道要读取到哪里。所以如果流的读取方不是BinaryReader,这些长度前缀就是多余甚至是有害的,这种情况下就不能使用BinaryWriter.Write(string)方法。要想安全地获取字符串的字节数据用UTF8Encoding的方式。
感谢这位老哥的文章
这篇关于C#字符串字节的获取的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#