C# 从字符到字节的转换中使用的编码
查看以下C代码(从中的C# 从字符到字节的转换中使用的编码,c#,character-encoding,casting,C#,Character Encoding,Casting,查看以下C代码(从中的BuildProtectedURLWithValidity函数中提取的函数): 我的问题是:从字节到字符的转换在编码方面有什么作用? 我猜它在编码方面真的没有什么作用,但这是否意味着编码。默认值是使用的,因此返回的字节将取决于框架如何在特定操作系统中对底层字符串进行编码 除此之外,字符是否大于一个字节(我猜是2个字节),并且会忽略第一个字节 我想用以下方式来取代这一切: Encoding.UTF8.GetBytes(stringToBeHashed) 您觉得怎么样?NET
BuildProtectedURLWithValidity
函数中提取的函数):
我的问题是:从字节到字符的转换在编码方面有什么作用?
我猜它在编码方面真的没有什么作用,但这是否意味着编码。默认值是使用的,因此返回的字节将取决于框架如何在特定操作系统中对底层字符串进行编码
除此之外,字符是否大于一个字节(我猜是2个字节),并且会忽略第一个字节
我想用以下方式来取代这一切:
Encoding.UTF8.GetBytes(stringToBeHashed)
您觉得怎么样?NET Framework使用Unicode来表示其所有字符和字符串。字符的整数值(可以通过强制转换为
int
)相当于其UTF-16代码单元。对于基本多语言平面中的字符(构成您将遇到的大多数字符),此值为Unicode代码点
NET Framework使用Char
结构来表示Unicode字符。Unicode标准使用唯一的21位标量编号(称为码点)标识每个Unicode字符,并定义UTF-16编码形式,该形式指定如何将码点编码为一个或多个16位值的序列。每个16位值的范围从十六进制0x0000
到0xFFFF
,并存储在Char
结构中。Char
对象的值是其16位数字(序数)值。-
将字符
强制转换为字节
将导致值大于255的任何字符的数据丢失。尝试运行以下简单示例以了解原因:
char c1 = 'D'; // code point 68
byte b1 = (byte)c1; // b1 is 68
char c2 = 'ń'; // code point 324
byte b2 = (byte)c2; // b2 is 68 too!
// 324 % 256 == 68
是的,您肯定应该使用
编码.UTF8.GetBytes
来代替。在字节
和字符
之间转换就像使用编码(=Unicode的前256个字符),只是在对U+00FF以外的字符进行编码时,它会自动丢失信息
除此之外,字符是否大于一个字节(我猜是2个字节),并且会忽略第一个字节
对。C#
char
=UTF-16代码单元=2字节。char
表示16位UTF-16代码点。将字符
强制转换为字节
会导致字符的低位字节,但Douglas和dan04都是错误的,因为它总是悄悄地丢弃高位字节。如果较高的字节不是零,则结果取决于是否设置了编译器选项检查算术溢出/下溢:
带有溢出检查的输出:
Casting to byte character # 115: Success
Casting to byte character # 1099: Arithmetic operation resulted in an overflow.
Casting to byte character # 115: Success
Casting to byte character # 1099: Success
无溢出检查的输出:
Casting to byte character # 115: Success
Casting to byte character # 1099: Arithmetic operation resulted in an overflow.
Casting to byte character # 115: Success
Casting to byte character # 1099: Success
也许在某些奇怪的环境中,它确实会抛出,但我认为在大多数环境中,这种情况不会抛出。我已经在本地的“Microsoft(R)Visual C编译器版本4.6.1590.0”和repl.it中进行了测试。在这两种情况下,两者都会返回成功(没有像您的输出所示的异常)。@Mariano Desanze,我不能告诉您Mono的情况,但是如果MS自己的参考源清楚地显示输入字符在转换之前(第725行)为
Byte.MaxValue
,那么MS如何能够无误地转换它,如果char的值不适合一个字节,则引发异常?我的环境并不奇怪,它是纯香草的.NET3.5。无声丢弃较高的字节是一个坏主意:我在SharpDevelop中启用了算术溢出/下溢检查选项。因此,此转换的结果是矛盾的,即取决于编译器设置!如果是那样的话,很抱歉投了反对票。如果您编辑您的答案,我将还原它,否则我无法还原(也许您可以澄清,它不会影响所有环境)。但这真的很奇怪,因为即使在在线解释器上,您也可以将char c=';控制台写入线((字节)c)代码>并看到它返回“75”而不是异常。我已经编辑了答案,感谢您的反馈。看起来溢出检查在默认情况下处于关闭状态。