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.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#使用BitConverter与BitArray类进行预定义基础类型转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# 位图BitArray的使用

    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进. 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿之间,如何快速确定某个整数是否在这个1千万个整数中呢? 乍一看是一个查找问题,循环.二分查找都是常规思路. 一个好的答案是存储结构和算法的完美结合, 基于题干上的特征和条件,我们是否有其他思路. 对于题干我们使用高中排列组合的思维:有1亿个有编号的空篮子,我们拿出这1千万个有数字的球,放进对应的篮子. 最后,所有的篮

  • C# BitArray(点矩阵)转换成int和string的方法实现

    BitArray的基础可以看菜鸟编程 BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0). 当您需要存储位,但是事先不知道位数时,则使用点阵列.您可以使用整型索引从点阵列集合中访问各项,索引从零开始. BitArray 类的方法和属性 下表列出了 BitArray 类的一些常用的 属性: 属性 描述 Count 获取 BitArray 中包含的元素个数. IsReadOnly 获取一个值,表示 BitArray

  • C#中BitConverter.ToUInt16()和BitConverter.ToString()的简单使用

    下面是msdn中的一个例子,在我刚看到这里例子时,该例子有三点是我可以学到的. 第一:排列格式.如:定义一个常量变量const  string  a="{0,11}{1,10},{2,7}"; 这样一个格式用来排列三个变量的位置,第一个变量占5个位置,第二个变量占8个位置,第三个变量占10个位置.中英文都算一个位置.比如在控制台上输出 Console.WriteLine(a,"以后想找什么当另外一半","找个又帅又有车的","那买副象棋

  • C# 用什么方法将BitConverter.ToString产生字符串再转换回去

    本文介绍了C# 用什么方法将BitConverter.ToString产生字符串再转换回去,分享给大家,具体如下: byte[] bytTemp = System.Text.Encoding.Default.GetBytes("String"); string str = System.BitConverter.ToString(bytTemp); Console.WriteLine(str); string[] strSplit = str.Split('-'); byte[] by

  • 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.

  • 需灵活掌握的Bootstrap预定义排版类 你精通吗?

    有了Bootstrap前端框架预处理好的排版类,我们从此不必再为每个排版的标签元素写大量的CSS代码了,可以使用 Bootstrap 的排版特性,您可以创建标题.段落.列表及其他内联元素预定义好的样式,排版出很规范的网页. 那我们接下来一起学习下,bootstrap前端框架到底为我们预定义了那些排版的类呢? 第一:Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈,这些字体都是目前所有网页最经常用的字体了.从此

  • 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.

  • ASP.NET预定义模板介绍

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

  • 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第

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

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

  • C#预定义数据类型之值类型和引用类型介绍

    C#的预定义数据类型包括两种,一种是值类型,一种是引用类型.值类型的变量在内存中是存储在堆栈中的,字面上理解就是直接保存其值,如声明一个属于值类型的整型变量,并给它赋予另一个整型变量的值,则在内存中事先复制一个整型变量的值,然后将其赋予刚刚声明的整型变量,这时内存中就会有两个整型值.引用类型的变量在内存中是直接保存其值的引用.C#语言中大多数复杂数据类型都是引用类型. 先来一个值类型的常量的例子 根据用户输入圆的半径,求圆的面积的代码: using System; using System.Co

  • 轻松学习C#的预定义数据类型

    C#的预定义数据类型包括两种,一种是值类型,一种是引用类型.值类型的变量在内存中是存储在堆栈中的,字面上理解就是直接保存其值,如声明一个属于值类型的整型变量,并给它赋予另一个整型变量的值,则在内存中事先复制一个整型变量的值,然后将其赋予刚刚声明的整型变量,这时内存中就会有两个整型值.引用类型的变量在内存中是直接保存其值的引用.C#语言中大多数复杂数据类型都是引用类型.        先来一个值类型的常量的例子        根据用户输入圆的半径,求圆的面积的代码: <span style="

  • PHP之预定义接口详解

    在PHP中有好几个预定义的接口,比较常用的四个接口(IteratorAggregate(聚合式aggregate迭代器Iterator).Countable.ArrayAccess.Iterator)分别给大家详细介绍下. IteratorAggregate(聚合式aggregate迭代器Iterator)接口 复制代码 代码如下: IteratorAggregate extends Traversable {  abstract public Traversable getIterator(v

  • PHP的PDO预定义常量讲解

    PHP PDO预定义常量 以下常量由本扩展模块定义,因此只有在本扩展的模块被编译到PHP中,或者在运行时被动态加载后才有效. 注意:PDO使用类常量自PHP 5.1.以前的版本使用的全局常量形式PDO_PARAM_BOOL中. PDO::PARAM_BOOL (integer) 表示布尔数据类型. PDO::PARAM_NULL (integer) 表示 SQL 中的 NULL 数据类型. PDO::PARAM_INT (integer) 表示 SQL 中的整型. PDO::PARAM_STR

随机推荐