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
猜你喜欢
- 基于JavaFX开发桌面程序注:我也是JAVA FX的初学者之一,自己在学习的时候踩了许多的坑,中文英文的资料查了不少,但是觉得FX技术和其
- 前言java有八个基本数据类型,每个都有对应的一个包装类,比如int对应的Integer。 Integer 是int的包装类型,数据类型是类
- 正在尝试分配更低的访问权限?在进行Java编程时会给我们报出如下提示怎么办?这里我们将给大家介绍详细的解决方法。首先,查看,控制台给出的提示
- 一、分步骤集成1.1 整合连接池hikariCP介绍:HikariCP 是一个高性能的 JDBC 连接池组件,可以避免连接频繁建立、关闭的开
- Maven使用说明及规范此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则。我们工作中会经常写maven的配
- Gradle和Maven都是当前热门的自动化构建工具。使用Gradle去构建项目,由于没有办法像Maven一样配置Setting文件来修改本
- 要获取Java中的当前时间戳:Timestamp timestamp = new Timestamp(System.currentTimeM
- 1. 公共字段自动填充1.1 问题分析在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间、修改人等字
- 在spring boot中,简单几步,使用spring AOP实现一个 * :1、引入依赖:<dependency> &nbs
- OpenFeign介绍一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们
- 本文实例分析了Java中的传值调用。分享给大家供大家参考。具体分析如下:Java以引用的方式操作对象实例可以确认的是Java中操作对象的方式
- 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。程序分析:请抓住分子与分母的变化规
- 问题描述平常用的是java8,最近在学习java的新特性。这就需要从java8往更高的java版本切换。由于还在使用java8,测试完新特性
- 1. 字段取别名,和属性名保持一致映射文件<mapper namespace="com.atguigu.mybatis.ma
- 今天有个项目需要使用redis,并且有使用脚本的需求。但是因为之前没有写过,所以还有一点点不熟悉,今天记录一下。原因:原子操作,redis会
- 表述在一次服务更新后发现每天凌晨0点3秒服务准时挂,开始的时候认为是maven依赖中存在system.exit(3)类似这样的代码,但是我想
- 概述线上项目发布一般有以下几种方案:机发布蓝绿部署滚动部署灰度发布停机发布 这种发布一般在夜里或者进行大版本升级的时候发布,因为需要停机,所
- 本文实例讲述了java实现List中对象排序的方法。分享给大家供大家参考,具体如下:package com.test; import jav
- 解决方法有如下两种:第一种如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/
- zuul添加或修改请求参数一、为什么要用到这个在基于 springcloud 构建的微服务系统中,通常使用网关zuul来进行一些用户验证等过