C#预定义的基础类型转换
作者:springsnow 发布时间:2023-08-13 03:14:16
一、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、举例说明:
整数 | 对应的十六进制数 | 转成字节数组byte[] BitConverter.GetBytes(**) | 字节数据每个字节对应的十六进制表示 |
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();
}
}
结果:
来源:https://www.cnblogs.com/springsnow/p/9546717.html


猜你喜欢
- import java.util.Scanner;public class VariableExchange { &n
- 一:引入依赖包<!-- https://mvnrepository.com/artifact/org.springframework.
- 由于GitHub上面的zxing功能太多,有的用不到,我就抽取了重要的出来使用,这个可以生成二维码,扫描二维码和相册中的二维码Demo效果:
- Spring框架提供了事务管理的标准实现,且可以通过注解或者XML文件的方式声明和配置事务。通过异步事件的方式解耦服务调用,可以提高程序的响
- 该方法使用的jdk1.6以后自带的分页工具类实现public static void main(String[] args) {  
- 本文实例讲述了android中Bitmap用法。分享给大家供大家参考。具体如下:在Android SDK中可以支持的图片格式如下:png ,
- 本文实例讲述了Android开发中计算器的sin、cos及tan值计算问题。分享给大家供大家参考,具体如下:接到一个需求 :要求计算器sin
- 本文介绍了Android:利用SharedPreferences实现自动登录,具体如下:主要代码:public class LoginAct
- 前言本文主要给大家介绍了关于C#中foreach遍历的用法以及c#使用foreach需要知道的一些事,分享出来供大家参考学习,下面话不多说了
- 概述在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条
- 一、时区的基本概念GMT(Greenwich Mean Time),即格林威治标准时,是东西经零度的地方。人们将地球人为的分为24等份,每一
- 有兴趣的朋友可以回顾一下前两篇java并发编程专题(一)----线程基础知识java并发编程专题(二)----如何创建并运行java线程在现
- JVM 的主要作用是什么?JVM 就是 Java Virtual Machine(Java虚拟机)的缩写,JVM 屏蔽了与具体操作系统平台相
- PS:用了一下个推.感觉实现第三方应用的推送功能还是比较简单的.官方文档写的也非常的明确.学习内容:1.使用个推实现第三方应用的推送.所有的
- 错误处理到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以
- Android资源文件大致可以分为两种:第一种是res目录下存放的可编译的资源文件:这种资源文件系统会在R.java里面自动生成该资源文件的
- 本文实例讲述了Android开发之ListView的简单用法及定制ListView界面操作。分享给大家供大家参考,具体如下:效果:如何从获得
- 会话会话:用户打开浏览器进行的一系列操作直至关闭浏览器的过程看作是一次会话HTTP协议是无状态的,不能实现跟踪对话。比如进入一个网站,每次操
- 查看JDK1.8 ArrayList的源代码1、默认初始容量为10 /** * Default i
- Feign动态设置header和原理项目中用到了Feign做远程调用, 有部分场景需要动态配置header开始的做法是通过 @Request