(C#基础) byte[] 之初始化, 赋值,转换。

2016年05月30日 19:30:32

 

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<StructType>(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);
            return structObject;
        }
代码

     /// <summary>
        /// 将byte[]还原为指定的struct,该函数的泛型仅用于自定义结构
        /// startIndex:数组中 Copy 开始位置的从零开始的索引。
        /// length:要复制的数组元素的数目。
        /// </summary>
        public static T BytesToStruct<T>(byte[] bytes, int startIndex, int length)
        {
            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[]

代码 

     /// <summary>
        /// 将struct类型转换为byte[]
        /// </summary>
        public static byte[] StructToBytes(object structObj, int size)
        {
            IntPtr buffer = Marshal.AllocHGlobal(size);
            try//struct_bytes转换
            {
                Marshal.StructureToPtr(structObj, buffer, false);
                byte[] bytes = new byte[size];
                Marshal.Copy(buffer, bytes, 0, size);
                return bytes;
            }
            catch (Exception ex)
            {
                throw new Exception("Error in StructToBytes ! " + ex.Message);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

 

byte[] 数组比较

//You can use Enumerable.SequenceEqual method.

using System;
using System.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 );

 

java基本类型数组初始化

1.byte、short、int、long类型数组,数组元素默认初始化为0。 byte[] i= new byte[10]; //short[] i = new short[10]; //int...
  • lskyne
  • lskyne
  • 2013年05月14日 20:50
  • 58536

(C#基础) byte[] 之初始化, 赋值,转换。

byte[] 之初始化赋值 用for loop 赋值当然是最基本的方法,不过在C#里面还有其他的便捷方法。 1. 创建一个长度为10的byte数组,并且其中每个byte的值为0. byte[] m...
  • Andrewniu
  • Andrewniu
  • 2017年05月18日 15:06
  • 2276

(C#基础) byte[] 之初始化, 赋值,转换。

(C#基础) byte[] 之初始化, 赋值,转换。 byte[] 之初始化赋值 用for loop 赋值当然是最基本的方法,不过在C#里面还有其他的便捷方法。 1. 创建一个长度为10的byt...
  • rattles
  • rattles
  • 2016年05月30日 19:30
  • 4445

[分享]Java中Byte与基础类型之间的转换

因为在Socket的传输中都是 Bytes 的传输,所以涉及到 Java 基本类型(char、short、int、long)与byte[] 的转化,自己总结了一下,简单的写了一个类。...
  • qiujuer
  • qiujuer
  • 2015年04月20日 16:50
  • 3067

【转】(C#基础) byte[] 之初始化, 赋值,转换

转自:http://www.cnblogs.com/fdyang/archive/2013/10/20/3378974.html byte[] 之初始化赋值 用for loop 赋值当...
  • zjwen2007
  • zjwen2007
  • 2015年01月17日 16:30
  • 3000

ByteBuffer的初始化及赋值语句

ByteBuffer类没有构造函数,只能通过 ByteBuffer.allocate(int capacity) 或者 warp 构造对象。 如果将一个ByteBuffer 对象a赋值给另一个Byte...
  • yiyecheer
  • yiyecheer
  • 2016年11月02日 14:48
  • 1611

(C#基础) byte[] 之初始化, 赋值,转换。

转载连接: http://www.cnblogs.com/fdyang/archive/2013/10/20/3378974.html byte[] 之初始化赋值 用for l...
  • newbie_xymt
  • newbie_xymt
  • 2017年08月01日 17:19
  • 332

JAVA byte赋值的问题

这两天利用java进行消息编解码的时候,总是碰到一个问题,需要给byte赋值. 如 需要将第一位地址的值 aa赋给一个变量,就很是比较麻烦。今天写了一个,记录下来 public stat...
  • eyoulc123
  • eyoulc123
  • 2016年09月10日 18:14
  • 8874

java初学者知识小总结-01(byte数据类型赋值出错)

java中byte赋值时候的易错点
  • u010668028
  • u010668028
  • 2015年06月28日 21:55
  • 3619

byte数组之间的赋值,byte和TCHAR数组的赋值

第一步很关键,给byte数组赋值, byte tzi[2][44] =  { 0xD0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0...
  • ahjxly
  • ahjxly
  • 2013年05月10日 09:42
  • 2712
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(C#基础) byte[] 之初始化, 赋值,转换。
举报原因:
原因补充:

(最多只允许输入30个字)