C# 中的char 和 byte
程序员文章站
2022-05-27 08:37:14
...
在C#中,char代表一个Unicode的字符,占用的内存不是一个byte。而byte还是一个字节。
那么在char和byte之间copy操作时,可能结果不是我们想要的。
示例:
static void Main(string[] args)
{
byte[] bytes = { 0x31,0x32,0x33,0x34}; //
char[] chars1 = new char[4];
char[] chars2 = new char[4];
//
System.Buffer.BlockCopy(bytes,0,chars1,0,4);
for (int i = 0; i<4; i++)
{
chars2[i] = (char)bytes[i];
}
string str1 = new string(chars1); //
string str2 = new string(chars2); // 1234
System.Console.Read();
}
执行时的内存情况:
using System.Globalization;
using System.Runtime;
using System.Runtime.InteropServices;
namespace System
{
//
// 摘要:
// 将字符表示为 UTF-16 代码单位。
[ComVisible(true)]
public struct Char : IComparable, IConvertible, IComparable<Char>, IEquatable<Char>
{
//
// 摘要:
// 表示 System.Char 的最大可能值。此字段为常数。
public const Char MaxValue = '\uffff';
//
// 摘要:
// 表示 System.Char 的最小可能值。此字段为常数。
public const Char MinValue = '\0';
//
// 摘要:
// 将指定的 Unicode 码位转换为 UTF-16 编码字符串。
//
// 参数:
// utf32:
// 21 位 Unicode 码位。
//
// 返回结果:
// 由一个 System.Char 对象或一个 System.Char 对象的代理项对组成的字符串,等效于 utf32 参数所指定的码位。
//
// 异常:
// T:System.ArgumentOutOfRangeException:
// utf32 不是从 U+0 到 U+10FFFF 的有效的 21 位 Unicode 码位,不包括从 U+D800 到 U+DFFF 的代理项对。
public static string ConvertFromUtf32(int utf32);
//
// 摘要:
// 将 UTF-16 编码的代理项对的值转换为 Unicode 码位。
//
// 参数:
// highSurrogate:
// 高代理项代码单元(即代码单元从 U+D800 到 U+DBFF)。
//
// lowSurrogate:
// 低代理项代码单元(即代码单元从 U+DC00 到 U+DFFF)。
//
// 返回结果:
// highSurrogate 和 lowSurrogate 参数表示的 21 位 Unicode 码位。
//
// 异常:
// T:System.ArgumentOutOfRangeException:
// highSurrogate 不在 U+D800 到 U+DBFF 的范围内,或 lowSurrogate 不在 U+DC00 到 U+DFFF 的范围内。
public static int ConvertToUtf32(Char highSurrogate, Char lowSurrogate);
// ... ...
}
}
//
// 摘要:
// 表示一个 8 位无符号整数。
[ComVisible(true)]
public struct Byte : IComparable, IFormattable, IConvertible, IComparable<Byte>, IEquatable<Byte>
{
//
// 摘要:
// 表示 System.Byte 的最大可能值。此字段为常数。
public const Byte MaxValue = 255;
//
// 摘要:
// 表示 System.Byte 的最小可能值。此字段为常数。
public const Byte MinValue = 0;
// ... ...
}
}