首页 > 编程语言 >c#中byte数组0x_(C#基础) byte[] 之初始化, 赋值,转换。

c#中byte数组0x_(C#基础) byte[] 之初始化, 赋值,转换。

时间:2023-04-12 19:34:30浏览次数:58  
标签:string c# 0x ushort bytes new byte Marshal

c#中byte数组0x_(C#基础) byte[] 之初始化, 赋值,转换。
原文链接:https://blog.csdn.net/weixin_39862716/article/details/111506430

byte[] 之初始化赋值

用for loop 赋值当然是最基本的方法,不过在C#里面还有其他的便捷方法。

1. 创建一个长度为10的byte数组,并且其中每个byte的值为0.

byte[] myByteArray = new byte[10];

C# 在创建数值型(int, byte)数组时,会自动的把数组中的每个元素赋值为0.  (注:如果是string[], 则每个元素为的值为null.

2. 创建一个长度为10的byte数组,并且其中每个byte的值为0x08.

byte[] myByteArray = Enumerable.Repeat((byte)0x08, 10).ToArray();

用linq来赋值,语句只要一条, 当然我们还可以赋值不同的,但是有一定规律的值。

byte[] res= Enumerable.Range(1, 1000).Select(c=>Convert.ToByte(c)).ToArray();

3. 直接赋值

byte[] myByteArray = new byte[] { 0x01, 0x02, 0x03 };

byte[] ---> ushort

byte[] array = new byte[] { 0xFE, 0x00};ushort register = BitConverter.ToUInt16(array, 0);

上述转换后register 的值为 0x00FE

byte[] array = new byte[] { 0x02, 0x01 ,0x04, 0x03};ushort register = BitConverter.ToUInt16(array, 0);

上述转化后,其实只是取了array[0], array[1].的值,最后register 的值是 0x00010002, 即258

byte[] -> string

public static string ByteArrayToString(byte[] ba)

{string hex =BitConverter.ToString(ba);return hex.Replace("-","");

}

ushort ---> byte[]

ushort register = 0x00F0;byte[] arr = BitConverter.GetBytes(register);

在PC系统里, arr[0] = 0xF0(地位), arr[1] = 0x00 .

互换ushort中的两个字节

ushort number = 0x00F0;byte[] temp =BitConverter.GetBytes(number);

Array.Reverse(temp);ushort a = BitConverter.ToUInt16(temp, 0);ushort b = (ushort)(number << 8 | ((number & 0xFF00) >> 8));

byte[] => Struct

public StructType ConverBytesToStructure(byte[] bytesBuffer)

{//检查长度。

if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))

{throw new ArgumentException("bytesBuffer参数和structObject参数字节长度不一致。");

}

IntPtr bufferHandler=Marshal.AllocHGlobal(bytesBuffer.Length);for (int index = 0; index < bytesBuffer.Length; index++)

{

Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);

}

StructType structObject= (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));

Marshal.FreeHGlobal(bufferHandler);returnstructObject;

}

代码///

///将byte[]还原为指定的struct,该函数的泛型仅用于自定义结构///startIndex:数组中 Copy 开始位置的从零开始的索引。///length:要复制的数组元素的数目。///

public static T BytesToStruct(byte[] bytes, int startIndex, intlength)

{if (bytes == null) return default(T);if (bytes.Length <= 0) return default(T);

IntPtr buffer=Marshal.AllocHGlobal(length);try//struct_bytes转换

{

Marshal.Copy(bytes, startIndex, buffer, length);return (T)Marshal.PtrToStructure(buffer, typeof(T));

}catch(Exception ex)

{throw new Exception("Error in BytesToStruct !" +ex.Message);

}finally{

Marshal.FreeHGlobal(buffer);

}

}

Struct => byte[]

代码///

///将struct类型转换为byte[]///

public static byte[] StructToBytes(object structObj, intsize)

{

IntPtr buffer=Marshal.AllocHGlobal(size);try//struct_bytes转换

{

Marshal.StructureToPtr(structObj, buffer,false);byte[] bytes = new byte[size];

Marshal.Copy(buffer, bytes,0, size);returnbytes;

}catch(Exception ex)

{throw new Exception("Error in StructToBytes !" +ex.Message);

}finally{

Marshal.FreeHGlobal(buffer);

}

}

byte[] 数组比较

//You can use Enumerable.SequenceEqual method.

usingSystem;usingSystem.Linq;

...var a1 = new int[] { 1, 2, 3};var a2 = new int[] { 1, 2, 3};var a3 = new int[] { 1, 2, 4};var x = a1.SequenceEqual(a2); //true

var y = a1.SequenceEqual(a3); //false

string类型转成byte[]:

byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str );

byte[]转成string:

string str = System.Text.Encoding.Default.GetString ( byteArray );

string类型转成ASCII byte[]:

("01" 转成 byte[] = new byte[]{ 0x30,0x31})

byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str );

ASCIIbyte[]转成string:

(byte[] = new byte[]{ 0x30, 0x31} 转成"01")

string str = System.Text.Encoding.ASCII.GetString ( byteArray );

标签:string,c#,0x,ushort,bytes,new,byte,Marshal
From: https://www.cnblogs.com/sunny3158/p/17310970.html

相关文章

  • Docker快速入门 第二篇
    目录Docker一、Iass-Paas和Saas1、简介二、Docker常用命令1、镜像站设置2、启动/停止常用命令三、镜像命令相关四、容器相关命令Docker一、Iass-Paas和Saas1、简介什么是lass-Pass和Saas:#Iaas:Infrastructure-as-a-Service(基础设施即服务) IaaS公司会提供场外服务器,存储......
  • C#中byte数组与string类型之间的转换
    C#中byte数组与string类型之间的转换原文链接:https://blog.csdn.net/weixin_44359158/article/details/116457477string类型转换为byte[]:stringstr="Test";byte[]bytTemp=System.Text.Encoding.Default.GetBytes(str);12byte[]转换为stringstringstrTemp=Sy......
  • centos安装MySQL8记录
    1.卸载mariadb因centos7默认安装了mariadb,会造成依赖冲突,按下列方式进行卸载:rpm-qa|grepmariadb#如果出现mariadb-libs-5.5.68-1.el7.x86_64#执行rpm-emariadb-libs--nodeps2.下载  注意权限:(chmod-R777/var/lib/mysql)(chmod-R777/var......
  • 什么是Iaas-Paas和Saas,Docker镜像与容器,docker 启动设置镜像,docker启动与停止常用命令
    什么是Iaas-Paas和Saas,Docker镜像与容器,docker启动设置镜像,docker启动与停止常用命令,镜像相关命令,容器相关命令什么是Iaas-Paas和Saas#Iaas----->Infrastructure-as-a-Service(基础设施即服务) Iaas公司会提供场外服务器,存储和网络硬件,可以租用场外的服务器。节省了维护......
  • 在线安装gfortran的方法-CentOS8 or 阿里龙蜥
    在线安装gfortran的方法-CentOS8or阿里龙蜥背景在阿里云上面进行了speccpu2006的测试验证但是发现总是很多包安装不过去原因是阿里最小化安装的龙蜥系统.缺少很多编译工具.昨天晚上死活跑步过去发现是因为缺少部分编译工具gfortran报错信息specmake:g++:Command......
  • [C++]LeetCode1147. 段式回文
    [C++]LeetCode1147.段式回文题目描述Difficulty:困难RelatedTopics:贪心,双指针,字符串,动态规划,哈希函数,滚动哈希你会得到一个字符串text。你应该把它分成k个子字符串(subtext1,subtext2,…,subtextk),要求满足:subtexti是非空字符串所有子字符串的连接......
  • Legacy/biso/MBR和UEFI/GPT
    Legacy和Bios引导分区系统启动顺序区别MBR格式分区GPT格式分区......
  • 关于百鸡百钱问题的C语言解决
    百鸡百钱问题 1.问题描述公鸡5钱一只,母鸡3钱一只,小鸡1钱三只,用一百个钱买一百只鸡,公鸡,母鸡,小鸡各多少只2.设计思路不妨先设公鸡数量为x母鸡数量为y小鸡数量为z则可列出方程:x+y+z=1005x+3y+1/3z=100又因为只有100钱所以x<20y<333.程序流程 4.代码#include<stdio.h>......
  • percona公司的proxysql安装与配置
    #####################    安装包类型:源码包rpm安装包免编译二进制                 ########################......
  • ue4.27 VScode 找不到源文件修复方法
    修改.vscode目录下compileCommands_***.json多个文件 { "file":"E:\\\\UnrealProjects\\\\wargame_sanguo\\\\Source\\\\wargame_sanguo\\\\.vs\\\\ProjectSettings.json", "command":"E:\\UnrealProjects\\w......