四联光电智能照明论坛

标题: byte[] 之初始化赋值 [打印本页]

作者: admin    时间: 2017-1-4 15:56
标题: 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中的两个字节


  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





欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2