c#值类型转换(类型转换,格式显示)

C#是面向对象编程:把 值类型方法行为  来封装描述出对象 (new class();)

值类型

数:(绝对值正整数)

byte      8bit   可表示 0~255
ushort   16bit   可表示 0~65535         //  6万  USHORT【u16】
uint     32bit   可表示 0~42 9496 7295  // 42亿  Dword 【u32】
ulong    64bit   可表示 0~1844 6744 0737 0955 1615 // 两个卧槽

可负数:(不能表示小数,只能表示整数)

sbyte    8bit    可表示 -128~127
short   16bit    可表示 -32768~32767            //  3万
int     32bit    可表示 -2147483648~2147483647  // 21亿
long    64bit    可表示 -9223372036854775808~9223372036854775807  //卧槽。。。
                                            九年义务的参与者,我也不知道是多大

小数点数:(浮点数,可负数)

float       32bit小数       // 3.1415926f  // -7.654f
double      64bit小数       // 3.14159d   //可以不加d   -98.7654
decimal    128bit小数      -98.76m      3.14m

其它类型数据:()

object           盒子类型 //数据是二进制保存的,相当于截取二进制长度
dynamic          动态类型,运行的时候确定;   dynamic d = 20;
char*            指针类型      char* cptr;   int* iptr;
bool     1bit    false,true//假,真  逻辑关系
char     16bit   相当于照片的编号,输入索引值,显示出对应文字/符号的照片 '\u0000'到'\uFFFF'
string           字符串类型,是连续的char的倍数长度,一般用于输出连续文字和符号
char[]         转string需要用 new string(char数组);
StringBuilder    可变字符串:StringBuilder 坤=new StringBuilder("坤",49);// 最大49字
DateTime       时间类型 string ATtime = DateTime.Now.ToString("ss's'ffff:");// xx秒xxxx毫秒
class            对象类型(参数引用类型传递)
struct           对象结构体类型(参数值类型传递)
enum            枚举类型(有明确范围个数的,比如星期)
union           共用体(最大类型容器)
byte[,]         数组类型(引用类型)new byte[8, 13];

sizeof()        获取数据类型的字节大小  byte  num = sizeof(int);
typeof()        返回class类型
nameof()        输出变量的名字。
&                取变量的地址  函数方法前需要 unsafe修饰,然后工程要开启不安全代码。
*                指针,指向地址,返回对象
?:                条件表达式
is            判断是否为某一类型
as            强制转换【不会抛出异常】  Object  obj = new string("维修电工!");
                                      string  str = obj as  string;

C# 摒弃了指针写法,用ref和out代替指针,函数指针用委托代替。
static byte[,] buffer = new byte[8, 13];

static byte[,] buffer = new byte[, 13]; 最右侧13位置,必须写值,二维,三维的位置可以不写值

static byte[, ,] buffer = new byte[, ,13];

值与值转换:强制转换,用括号加类型

 int a = 65535;
 int b = (byte)a;
object a = 65535;
   int b = (byte)a;
主要用于string转值类型

int  num = int.Parse("12345");
double  num2 = double.Parse("-123.45");

int num3 = 13579;
string  str = num3.ToString();

获取值类型最大数

Int64 e= unchecked((Int64)(0x8000000000000000));

 获取值类型字节长度

 int Bytelen = sizeof(decimal); // 16 byte

右值二进制写法

// 这种写法一般用于PLC输出或单片机LED指示灯
int num = 0b00001111;    //二进制写法  0b开头
num = 0b111 << 5;  // 1110 0000
num = 1 << 7;      // 1000 0000

// 常规用法
   decimal  pai = 3.14159f;
            pai = 12345m;
            pai = 255;
            pai = 0xff;    // 十六进制
            pai = 0B00001111;  //0x0f

textBox3.Text += "你好!" + '\u000d' + '\u000a';  // 0x0000 到 0xFFFF

赋值操作:

注意:  0x80 是【int】类型 

// h d o b       十六进制,十进制,八进制,二进制
int a = 0xffff;
    a = 123456;
    a = 0777;
    a = 0b00010001;

    a = 0x80;  // 【注】这种 0x 写法,默认是【int类型】做加法需要注意

获取类型的大小: (单位:字节)

int qc = sizeof(decimal);// 16字节    128 bit
qc= sizeof(byte);//1
qc= sizeof(double );//8
qc = sizeof(float);//4
qc = sizeof(bool);//1
qc = sizeof(short);//2
qc = sizeof(int);//4
qc = sizeof(double);//8字节

qc = sizeof( 人类 );// 字节大小由《元素种子》大小决定。

万能转换方法:     Convert.

int a = 65535;
int b = Convert.ToByte(a);
bool a = false;
bool b = Convert.ToBoolean(a);
Convert.ToByte(a);//   8bit正数
Convert.ToUInt16(a);
Convert.ToUInt32(a);
Convert.ToUInt64(a);
Convert.ToSByte(a);//  8bit可负数
Convert.ToInt16(a);
Convert.ToInt32(a);
Convert.ToInt64(a);
Convert.ToSingle(a); //  float
Convert.ToDouble(a);
Convert.ToDecimal(a); // 十进制数
Convert.ToChar(a);    //  汉字
Convert.ToString(a);  //  字符串
Convert.ToDateTime(a); //  时间类型
Convert.FromBase64String("字符串转8bit的数组");
byte[] u8buffer = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 };
string str = Convert.ToBase64String(u8buffer); // .FromBase64String 的逆过程
Convert.ToString("01234567");
Convert.ToString(0x01234567);
//其他的方法自己去看方法原型

数组转换:

可以使用C#中的Array.Reverse()方法来实现byte数组的首尾调换。
具体实现方法如下:

public static byte[] ReverseBytes(byte[] bytes)
{
    Array.Reverse(bytes);
    return bytes;
}


该方法接受一个byte数组作为参数,使用Array.Reverse()方法将数组中的元素进行反转,
然后返回反转后的byte数组。使用该方法可以轻松地实现byte数组的首尾调换。

字符串转数组:
//===1=================
string str = "hello";
byte[] byteArray = Encoding.ASCII.GetBytes(str);
foreach (byte b in byteArray)
{
    Console.Write(b + " "); // 输出:104 101 108 108 111
}
//===2===将字符串值“01 02 03 04 05”转换为对应数组值0x01 0x02 0x03 0x04 0x05的C#代码:
string str = "01 02 03 04 05";
string[] strArr = str.Split(' ');
byte[] byteArr = new byte[strArr.Length];

for (int i = 0; i < strArr.Length; i++)
{
    byteArr[i] = Convert.ToByte(strArr[i],16);
}

foreach (byte b in byteArr)
{
    Console.Write("0x{0:X2} ", b);
}
运行结果为:0x01 0x02 0x03 0x04 0x05

//===3=================
string str = "01 02 03";
byte[] arr = str.Split(' ').Select(temp => "0x" + temp).Select(temp => (byte)Convert.ToInt32(temp, 16)).ToArray();

数组转字符串:
//===4==================
byte[] byteArray = new byte[] { 104, 101, 108, 108, 111 };
string str = Encoding.ASCII.GetString(byteArray);
Console.WriteLine(str); // 输出:hello

//===5=================
byte[] arr = new byte[] { 0x01, 0x02, 0x03 };
string str = BitConverter.ToString(arr).Replace("-", " ");
Console.WriteLine(str); // 输出:01 02 03







格式显示: 值类型以特殊的格式,显示成字符串

单个char是16bit   最大值 0xFFFF;
byte num =Convert.ToByte(“FF”,16) ;
1        转换                       .ToString();
2        二进制                     Convert.ToString(0x7F,2);
3        八进制                     Convert.ToString(0x7F,8);
4        十进制                     Convert.ToString(0x7F,10);
5        十六进制                   Convert.ToString(0x7F,16);
6        十六进制格式1              num.ToString("X4");  //补0
7               格式2             String.Format("{0,-20:X8}",num);//左对齐,总长20,十六进制长度8,补空白

小写16进制显示  :     num.ToString("x4");  //补0     最短4位长度的小写16进制

等效转换:BytesToHexStrings   

{0x12,0x34,0x56,0x78}    =>       "12345678"

#region 数组转等效字符串
        public string BytesToHexStrings(byte[] data)//change转换 , byte[ ]等效的string
        {
            string str = string.Empty;
            for (int i = 0; i < data.Length; i++)
            {
                str += data[i].ToString("X2");
            }
            return str;
        }

#endregion

 等效转换:StringsToHexBytes                   

"12345678"      =>        {0x12,0x34,0x56,0x78}   

#region 字符串转等效数组
        public byte[] StringsToHexBytes(string data)//change转换,string等效的byte[]
        {
            //清除所有空格
            string str = data.Replace(" ", "");
            //若字符个数为奇数,补一个0
            str += str.Length % 2 != 0 ? "0" : "";
            byte[] bytes = new byte[str.Length / 2];//用于返回结果
            for (int i = 0, c = bytes.Length; i < c; i++)//获取bytes值
            {
                bytes[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);
            }
            return bytes;
        }

#endregion

编码格式

这个一般用于类似串口这样的设备, 串口每次帧是 8bit的数据,这样字符串需要转换成8bit的数组才能批量发送。

编码

string txbuffer = "串口要发送的数据。";
byte[] tx = Encoding.Unicode.GetBytes(txbuffer);

string rx = Encoding.Unicode.GetString(tx);// 解码

解码: string rx = Encoding.Unicode.GetString(tx);// 解码

string txbuffer = "串口要发送的数据。";
byte[] tx = Encoding.Unicode.GetBytes(txbuffer);

string rx = Encoding.Unicode.GetString(tx);// 解码

 不常用的格式编码:

string txbuffer2 = "要发送的数据。";
            tx=Encoding.ASCII.GetBytes(txbuffer2);
            rx=Encoding.ASCII.GetString(tx);// 解码
                Encoding.UTF8.GetBytes
                Encoding.UTF8.GetString
                Encoding.BigEndianUnicode.GetBytes
                Encoding.BigEndianUnicode.GetString
                Encoding.UTF7.GetBytes
                Encoding.UTF7.GetString

DateTime 时间类型:

string ATtime = DateTime.Now.ToString("ss's'ffff:");// xx秒xxxx毫秒

DateTime dateTime = DateTime.Now; // 获取当前时间
string str=dateTime.ToString("ss's'fff"); //  XX秒XXX毫秒

string[] formats = {"d", "D", "f", "F", "g", "G", "m", "o", "r",
                          "s", "t", "T", "u", "U", "Y"};
// fff 毫秒3位
// ss  秒 2位
// YYYY 年 4位数
//  其它自己去测试

 其他转换,我目前还没有用到。大家可以留言。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值