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 );