Mar*_*nze 7 c# casting character-encoding
看看下面的C#代码(从http://wmsauth.org/examples中的BuildProtectedURLWithValidity函数中提取的函数):
byte[] StringToBytesToBeHashed(string to_be_hashed) {
byte[] to_be_hashed_byte_array = new byte[to_be_hashed.Length];
int i = 0;
foreach (char cur_char in to_be_hashed)
{
to_be_hashed_byte_array[i++] = (byte)cur_char;
}
return to_be_hashed_byte_array;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:从字节到字符的转换在编码方面做了什么?
我猜它在编码方面确实没有任何作用,但这是否意味着Encoding.Default是使用的那个,因此返回的字节将取决于框架如何编码特定操作系统中的底层字符串?
此外,char实际上大于一个字节(我猜2个字节)并且实际上会省略第一个字节?
我在想通过以下方式替换所有这些:
Encoding.UTF8.GetBytes(stringToBeHashed)
Run Code Online (Sandbox Code Playgroud)
你怎么看?
Dou*_*las 15
.NET Framework使用Unicode来表示其所有字符和字符串.char的整数值(可以通过强制转换获得int)等效于其UTF-16代码单元.对于基本多语言平面中的字符(构成您将遇到的大多数字符),此值是Unicode代码点.
.NET Framework使用该
Char结构来表示Unicode字符.Unicode标准使用称为代码点的唯一21位标量数来标识每个Unicode字符,并定义UTF-16编码格式,该格式指定如何将代码点编码为一个或多个16位值的序列.每个16位值的范围从十六进制0x0000到0xFFFF存储在Char结构中.Char对象的值是其16位数字(序数)值.- 字符结构
对于任何值大于255的字符,转换为charto byte将导致数据丢失.尝试运行以下简单示例以了解原因:
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
Run Code Online (Sandbox Code Playgroud)
是的,你肯定应该使用Encoding.UTF8.GetBytes.
| 归档时间: |
|
| 查看次数: |
8707 次 |
| 最近记录: |