四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2771|回复: 0
打印 上一主题 下一主题

byte[] 之初始化赋值

[复制链接]
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    跳转到指定楼层
    楼主
    发表于 2017-1-4 15:56:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    用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中的两个字节


    1.             ushort number = 0x00F0;

    2.             byte[] temp = BitConverter.GetBytes(number);
    3.             Array.Reverse(temp);

    4.             ushort a = BitConverter.ToUInt16(temp, 0);

    5.             ushort b = (ushort)(number << 8 | ((number & 0xFF00) >> 8));
    复制代码


    byte[] => Struct
    1. public StructType ConverBytesToStructure<StructType>(byte[] bytesBuffer)
    2.         {
    3.             // 检查长度。
    4.             if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))
    5.             {
    6.                 throw new ArgumentException("bytesBuffer参数和structObject参数字节长度不一致。");
    7.             }

    8.             IntPtr bufferHandler = Marshal.AllocHGlobal(bytesBuffer.Length);
    9.             for (int index = 0; index < bytesBuffer.Length; index++)
    10.             {
    11.                 Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
    12.             }
    13.             StructType structObject = (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));
    14.             Marshal.FreeHGlobal(bufferHandler);
    15.             return structObject;
    16.         }
    复制代码


    代码
    1.      /// <summary>
    2.         /// 将byte[]还原为指定的struct,该函数的泛型仅用于自定义结构
    3.         /// startIndex:数组中 Copy 开始位置的从零开始的索引。
    4.         /// length:要复制的数组元素的数目。
    5.         /// </summary>
    6.         public static T BytesToStruct<T>(byte[] bytes, int startIndex, int length)
    7.         {
    8.             if (bytes == null) return default(T);
    9.             if (bytes.Length <= 0) return default(T);
    10.             IntPtr buffer = Marshal.AllocHGlobal(length);
    11.             try//struct_bytes转换
    12.             {
    13.                 Marshal.Copy(bytes, startIndex, buffer, length);
    14.                 return (T)Marshal.PtrToStructure(buffer, typeof(T));
    15.             }
    16.             catch(Exception ex)
    17.             {
    18.                 throw new Exception("Error in BytesToStruct ! " + ex.Message);
    19.             }
    20.             finally
    21.             {
    22.                 Marshal.FreeHGlobal(buffer);
    23.             }
    24.         }
    复制代码


    Struct => byte[]
    代码
    1.      /// <summary>
    2.         /// 将struct类型转换为byte[]
    3.         /// </summary>
    4.         public static byte[] StructToBytes(object structObj, int size)
    5.         {
    6.             IntPtr buffer = Marshal.AllocHGlobal(size);
    7.             try//struct_bytes转换
    8.             {
    9.                 Marshal.StructureToPtr(structObj, buffer, false);
    10.                 byte[] bytes = new byte[size];
    11.                 Marshal.Copy(buffer, bytes, 0, size);
    12.                 return bytes;
    13.             }
    14.             catch (Exception ex)
    15.             {
    16.                 throw new Exception("Error in StructToBytes ! " + ex.Message);
    17.             }
    18.             finally
    19.             {
    20.                 Marshal.FreeHGlobal(buffer);
    21.             }
    22.         }
    复制代码




    byte[] 数组比较
    1. //You can use Enumerable.SequenceEqual method.

    2. using System;
    3. using System.Linq;
    4. ...
    5. var a1 = new int[] { 1, 2, 3};
    6. var a2 = new int[] { 1, 2, 3};
    7. var a3 = new int[] { 1, 2, 4};
    8. var x = a1.SequenceEqual(a2); // true
    9. 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 );


    参考: http://www.dotnetperls.com/initialize-array
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-8 08:05 , Processed in 1.078125 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表