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


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

    参考: http://www.dotnetperls.com/initialize-array

  • 相关阅读:
    C#使用Xamarin开发Android应用程序 -- 系列文章
    stealwatch里的安全功能——ETA结果会显示加密套件以及key长度,还有流量大小(例如41MB)
    钟平---逻辑英语的语法讲解
    python dpkt 解析 pcap 文件
    TOR的十个最好的替代工具
    tf.expand_dims 来增加维度
    安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备
    使用深度学习检测TOR流量——本质上是在利用报文的时序信息、传输速率建模
    利用神经网络进行网络流量识别——特征提取的方法是(1)直接原始报文提取前24字节,24个报文组成596像素图像CNN识别;或者直接去掉header后payload的前1024字节(2)传输报文的大小分布特征;也有加入时序结合LSTM后的CNN综合模型
    算法培训
  • 原文地址:https://www.cnblogs.com/fdyang/p/3378974.html
Copyright © 2020-2023  润新知