C#预定义的基础类型转换

一、BitConverter 将预定义的基础类型与字节数据进行互转(Unicode)

1、将值类型转成字节数组(Unicode):BitConverter.GetBytes()

byte[] data = BitConverter.GetBytes('哈');
Console.Write(data);//200,84 (两个字节)
Console.Write(BitConverter.GetBytes('1'));//49,0 (两个字节)
Console.Write(BitConverter.GetBytes(258));//2,1,0,0  (整数,32位,四个字节)
Console.Write(BitConverter.GetBytes(1.2));//8个元素 (八个字节)
Console.Write(BitConverter.GetBytes(true));//1 (一个字节)

2、将字节数组转成值类型:BitConverter.ToXXX()

char str = BitConverter.ToChar(new byte[] { 200, 84 }, 0);
Console.Write(str);//哈
short sho = BitConverter.ToInt16(new byte[] { 69, 0 }, 0);
Console.Write(sho.ToString());//69

3、将字节数组中每个元素值转成十六进制表示:BitConverter.ToString(byte[])

string strHex = BitConverter.ToString(new byte[] { 09, 45, 65, 0, 0 });
Console.Write(strHex);//09-2D-41-00-00
string strHex = BitConverter.ToString(new byte[] { 69, 0, 0, 0, 0 });
Console.Write(strHex);//45-00-00-00-00

注意:跟BitConverter.IsLittleEndian属性有关,true表示最大的有效字节位于单词的右端。

4、举例说明:

整数
对应的十六进制数 
(Convert.ToString(**, 16) )

转成字节数组byte[] 
BitConverter.GetBytes(**)

字节数据每个字节对应的十六进制表示 
BitConverter.ToString(**)

1 1:0x01 (两位两位地对齐) [1,0,0,0] 01- 00- 00 -00
65540 10004:0x1 00 04 (两位两位地对齐) [4,0,1,0] 04- 00- 01 -00
999999999 3B9AC9FF:0x3B9AC9FF (两位两位地对齐) [255,201,154,59] FF -C9- 9A -3B

二、字符与ASCII码转化:

一个ASCII码占一个字节,其中一个为检验位。共27=128个字符,只适合所有的拉丁字母。

1、字符转成ASCII码:

Console.Write(Convert.ToByte('a'));//97
Console.Write((int)'a');//97,强制转换
Console.Write(Convert.ToByte('1'));//49
Console.Write((int)'1');//49

2、ASCII码转成字符:

Convert.ToChar(97)=>'d';
(char)97='a' --强制转换:

注意:C#中的Char字符类型为Unicode类型,每个字符占2个字节。

三、字符串与十六进制表示的字节数组之间的转换

void Main()
 {
     Console.WriteLine(StrToHex("哈啊a的1我z!"));
     Console.WriteLine(HexToStr("B9 FE B0 A1 61 B5 C4 31 CE D2 7A 21"));
 }

//字符串转换成十六进制字符串
public string StrToHex(string mStr)
 {
     return BitConverter.ToString(ASCIIEncoding.Default.GetBytes(mStr)).Replace("-", " ");
 }
 // 十六进制字符串转换成字符串
public string HexToStr(string mHex)
 {
     mHex = mHex.Replace(" ", "");
     if (mHex.Length <= 0) return "";
     byte[] vBytes = new byte[mHex.Length / 2];
     for (int i = 0; i < mHex.Length; i += 2)
         if (!byte.TryParse(mHex.Substring(i, 2), NumberStyles.HexNumber, null, out vBytes[i / 2]))
             vBytes[i / 2] = 0;
     return ASCIIEncoding.Default.GetString(vBytes);
 }

四、BitArray类

BitArray类用来处理位集合。位集合是可以用来有效表示Boolean值的集合。注意:表示True/False的集合,不是0、1集合。

如:对常规数的二进制的显示或存储:

0 0 0 0 0 0 0 1

而对于在BitArray里的存储,它是如下格式:

True False False False False False False False

它的顺序是相反的,而且用布尔值很难便捷读懂,但实际上,我们应当把数值当作1和0这样直观的显示出来,并且顺序也要进行处理!

解决方法:BitArray里显示的格式是逆序的,并且每一位都用布尔值显示,我们无法改变BitArray类所用的内部代码,但我们可以编写外部代码,使它能够更加友好的便于理解的常规的方式显示出来。

属性

  • Count 获取 BitArray 中包含的元素个数。
  • IsReadOnly 获取一个值,表示 BitArray 是否只读。
  • Item 获取或设置 BitArray 中指定位置的位的值。
  • Length 获取或设置 BitArray 中的元素个数。

方法

  • BitArray And( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位与操作。
  • bool Get( int index ); 获取 BitArray 中指定位置的位的值。
  • BitArray Not();把当前的 BitArray 中的位值反转,以便设置为 true 的元素变为 false,设置为 false 的元素变为 true。
  • BitArray Or( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位或操作。
  • void Set( int index, bool value ); 把 BitArray 中指定位置的位设置为指定的值。
  • void SetAll( bool value ); 把 BitArray 中的所有位设置为指定的值。
  • BitArray Xor( BitArray value ); 对当前的 BitArray 中的元素和指定的 BitArray 中的相对应的元素执行按位异或操作。
  • CopyTo(Array, Int32) 从目标数组的指定索引处开始将整个 BitArray 复制到兼容的一维 Array。

举例:

下面创建一个字节数组,里面包含5个byte。

int bits;
string[] binNumber = new string[8];//
int binary;
byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };//定义一个字节型数组,存5个字节型数值:1,2,3,4,5,6
BitArray BitSet = new BitArray(ByteSet);//这里一定要注意,这里的每一个字节型数值是以位的形式、每一位用Boolean值、逆序存储在BitArray(1字节对应8位)
bits = 0;//bits是计数器,到8了就又归为初始值0;为的是方便知道操作完了一个字节型数值(1字节正好占8位)
binary = 7;//binary是二进制数组下标索引;初始值为7,这是因为BitArray里存储的数据和常规二进制数据的顺序是相反的
Console.WriteLine("BitSet里包含的元素数" + BitSet.Count);//40,因为数据在BitArray里是以位的形式存储的,5个字节型数值,一个字节占8位,所以共占40位!!!不是5!!!
for (int i = 0; i <= BitSet.Count - 1; i++)//遍历40个位,每个位存boolean值True/False
{
    Console.WriteLine("BitSet.Get(" + i + ")" + BitSet.Get(i));
    if (BitSet.Get(i) == true)
        binNumber[binary] = "1";//如果该位存储的true值,则转成1;
    else
        binNumber[binary] = "0";//如果该位存储的false值,则转成0;
    bits++;      //计数+1
    binary--;    //eg.第8位(下标7)存好,则将下标向左移1位存下一轮将位布尔值转成的二进制0/1

    if ((bits % 8) == 0)//当计数器为8时,表示一个字节型的数值已经表示完全了
    {
        binary = 7;//将存储字节型数值的二进制形式的String型数组的下标归初始
        bits = 0;
        for (int j = 0; j <= 7; j++)
            Console.Write(binNumber[j]);
        Console.WriteLine();
    }
}

结果:

取整型数组来试一试,整型数组是4字节,32位

int bits = 0;
int index = 31;
string[] s = new string[32];
int[] a = new int[] { 2, 3, 2, 7, 2147483647 };
BitArray BA = new BitArray(a);

Console.WriteLine("BA的大小:" + BA.Count);  //5*4*8=160

for (int i = 0; i < BA.Count; i++)
{
    Boolean b = BA.Get(i);
    if (b == true)
        s[index] = "1";
    else
        s[index] = "0";
    bits++;
    index--;
    if (bits % 32 == 0) //每隔一个数字(4*8)换行
    {
        bits = 0;
        index = 31;
        for (int j = 0; j <= 31; j++)
            Console.Write(s[j]);
        Console.WriteLine();
    }
}

结果:

到此这篇关于C#基础类型转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#数据类型转换(显式转型、隐式转型、强制转型)

    C# 的类型转换有显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问题的转换方式.由系统自动转换. 不同类型的数据进行操作(加减乘除赋值等等),是需要进行 类型转换 后,才能继续操作.所以需要“类型转换”. 隐式转型 隐式转型容易理解,当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换. 如 int i = 66666; long b = i; /

  • C# 数据类型转换

    目录 前言 相关介绍 一.函数方法 二.类型转换 [1]. 使用Convert转换 [2]. 使用类型名进行转换 总结 前言 在使用Console.Read()或Console.ReadLine()进行输入时,和Python语言的input()类似 两者都是把键盘键入的内容作为string类型返回,所以有些数据需要经过数据类型的转换才能进行计算. 相关介绍 C# System.Convert 类 微软官方C#函数文档 一.函数方法 下面罗列的函数方法不是全部,仅列举一些常用的 double这种有

  • C#强制类型转换小结

    1.任何一门编程语言均有相关数据类型.C#也不例外,其基本数据类型有int,short,long,float,double,string等.数据类型之间可以相互转换.不过转换过程要注意小类型能转换成大类型,但大类型一般不能转换成小类型.如int型可以转换成float型,但float型不一定可以转换成int型,至少这在C,C++是这样,但在C#中明显有了改变,似乎微软公司也允许这样的形式存在了.例如: double dbl_num=12345678910.456; int k = (int) db

  • C#数据类型及其转换详解

    前言 在C#中,数据类型可以分为以下几种类型: 值类型(Value types)引用类型(Reference types)指针类型(Pointer types) 其中指针类型只在不安全代码下使用,一般不涉及所以今天不讨论.我们主要探讨引用类型和值类型. 一.基本定义 值类型的变量在声明后,系统直接在托管栈中为其分配内存并保存其数据,其中值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct等,当我们声明一个引用类型时,系

  • C#类型转换之自定义隐式转换和显式转换

    目录 前言 基础知识 示例代码 实际应用 问题 答案 报错 其他 应用和设计 读音 前言 有时我们会遇到这么一种情况:在json数据里,数组里的数据类型不一致,导致我们不能直接反序列化为目标类型.最终我们只能反序列化为JObject类型,然后通过字符串取值的方式来取出数据. 下面介绍一种新方式:通过自定义隐式转换,把不一样的数据类型反序列化为一样的数据类型. 基础知识 类型转换有2种:隐式转换和显式转换.但是,不管是隐式转换,还是显式转换,都是生成了一个新对象返回的.改变新对象的属性,不会影响老

  • C#中数据类型的转换介绍

    目录 1.parse转换:将string类型转化为其他类型 2.任意类型转化为string类型 3.隐式转换:自动转换-->小范围到大范围自动转换 4.显示转换:强制转换-->由大范围到小范围的强制转换,不过可能会发生精度丢失 5.最后再给一个简单的题目考考大家: 今天学习了一下数据类型的转换,我整理出了一下笔记: 1.parse转换:将string类型转化为其他类型 //数据类型的转换 //即string"18"==> int 18, //1.parse转换:将st

  • C#中的自动类型转换和强制类型转换

    前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? int a = 1; double b = a; Console.WriteLine(b); 运行结果是:1 我们把一个整型的变量赋值给了一个浮点型的变量,可以正常的输出,如果我们把一个浮点型的变量赋值给一个整型的变量呢? double a = 1; int b = a; Console.WriteLine(b); 这样就会报错. 为什么呢?因为我们之前说过,变量就像一个容器,里面存放着变量的值.而数据类型就相当于容器的

  • C#自动类型转换与强制类型转换的讲解

    自动类型转换 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失.例如,从小的整数类型转换为大的整数类型,从派生类转换为基类. 转换规则 从存储范围小的类型到存储范围大的类型. 整数具体规则为: byte→short(char)→int→long→float→double 也就是说byte类型的变量可以自动转换为short类型,示例代码: byte b = 10; short sh = b; 在类型转换时可以跳跃.示例代码: byte b1 = 100; int

  • C#预定义的基础类型转换

    一.BitConverter 将预定义的基础类型与字节数据进行互转(Unicode) 1.将值类型转成字节数组(Unicode):BitConverter.GetBytes() byte[] data = BitConverter.GetBytes('哈'); Console.Write(data);//200,84 (两个字节) Console.Write(BitConverter.GetBytes('1'));//49,0 (两个字节) Console.Write(BitConverter.

  • C#中的预定义类型与引用类型

    一.预定义的值类型 一个字节(1Byte)=8位(8Bit) BitArarry类可以管理位Bit. 1.整型 所有的整形变量都能用十进制或十六进制表示:long a=0x12AB 对一个整形值如未指定类型,默认为int类型,可加上U,L,UL后缀表示其他类型. long a=1234L sbyte :无符号形式:1字节(8位),范围:0 ~ 255(28-1),十六进制表示:0x00-0xFF,System.SByte byte   :有符号形式:1字节(8位),范围:-128 ~ 127(-

  • C#使用BitConverter与BitArray类进行预定义基础类型转换

    一.BitConverter 将预定义的基础类型与字节数据进行互转(Unicode) 1.将值类型转成字节数组(Unicode):BitConverter.GetBytes() byte[] data = BitConverter.GetBytes('哈'); Console.Write(data);//200,84 (两个字节) Console.Write(BitConverter.GetBytes('1'));//49,0 (两个字节) Console.Write(BitConverter.

  • thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)

    本文整理总结了thinkPHP3.x常用的常量.分享给大家供大家参考,具体如下: 一.预定义常量 URL_COMMON=0 普通模式 URL URL_PATHINFO=1 PATHINFO URL URL_REWRITE=2 REWRITE URL URL_COMPAT=3 兼容模式 URL HAS_ONE=1 HAS_ONE 关联定义 BELONGS_TO=2 BELONGS_TO 关联定义 HAS_MANY=3 HAS_MANY 关联定义 MANY_TO_MANY=4 MANY_TO_MAN

  • Yii2.0预定义的别名功能小结

    本文实例讲述了Yii2.0预定义别名.分享给大家供大家参考,具体如下: 这里总结一下,默认预定义别名一共有12个,其中路径别名11个,URL别名只有 @web 1个: @yii 表示Yii框架所在的目录,也是 yii\BaseYii 类文件所在的位置; @app 表示正在运行的应用的根目录,一般是 digpage.com/frontend ; @vendor 表示Composer第三方库所在目录,一般是 @app/vendor 或 @app/../vendor ; @bower 表示Bower第

  • ASP.NET预定义模板介绍

    一. 实例演示:通过模板将布尔值显示为RadioButton 在默认的情况下,不论是对于编辑模式还是显示模式,一个布尔类型的属性值总是以一个CheckBox的形式呈现出来.我们创建如下一个表示员工的类型Employee,它具有一个布尔类型的属性IsPartTime表示该员工是否为兼职. public class Employee { [DisplayName("姓名")] public string Name { get; set; } [DisplayName("部门&qu

  • PHP预定义变量9大超全局数组用法详解

    1.$_SERVER $_SERVER超级全局变量包含由web服务器创建的信息,它提供了服务器和客户配置及当前请求环境的有关信息.根据服务器不同,$_SERVER中的变量值和变量个数会有差别,不过一般都可以找到CGI1.1规范中定义的变量.其中包括: $_SERVER['HTTP_REFERER']; 引导用户到达当前位置的页面的URL : $_SERVER['REMOTE_ADDR']; 客户IP地址 : $_SERVER['REQUEST_URI']; URL的路径部分.如果URL是 [ur

  • php学习笔记 [预定义数组(超全局数组)]

    复制代码 代码如下: <?php /* 预定义数组: * 自动全局变量---超全局数组 * * 1.包含了来自WEB服务器,客户端,运行环境和用户输入的数据 * 2.这些数组比较特别 * 3.全局范围内自动生效,都可以直接使用这些数组 * 4.用户不能自定义这些数组,但这些数组的操作方式和自己定义的数组操作的方式一样 * 5.在函数中直接可以使用这些数组 * * $_GET //经由URL请求提交至脚本的变量 * $_POST //经由HTTP POST 方法提交到脚本的变量 * $_REQUE

  • php中常用的预定义变量小结

    复制代码 代码如下: <?php echo "当前操作系统信息".PHP_OS."<br/>"; echo '本文件路径和文件名为:'.__FILE__.'<br />'; echo "当前PHP版本信息".PHP_VERSION."<br/>"; ?> 常用的php预定义变量! 前面的$_SERVER[PHP_SELF]返回的是一段信息,如"/upload/try.p

  • 十二、脚本元素、指令和预定义变量

    12.1 JSP脚本元素 JSP脚本元素用来插入Java代码,这些Java代码将出现在由当前JSP页面生成的Servlet中.脚本元素有三种格式: 表达式格式<%= expression %>:计算表达式并输出其结果. Scriptlet格式<% code %>:把代码插入到Servlet的service方法. 声明格式<%! code %>:把声明加入到Servlet类(在任何方法之外). 下面我们详细说明它们的用法. 12.1.1 JSP表达式 JSP表达式用来把J

随机推荐