c# 笔记

1、将一维数组转换为字符串的表现形式(string.Join)

  int[] data = new int[] { 10, 5, 48, 72, 14, 2, 88, 46 };

  System.Diagnostics.Trace.WriteLine(string.Join(",", data);

  输出结果:10,5,48,72,14,2,88,46

2、将字节数组转化为十六进制表现形式(BitConverter.ToString)

  byte[] data = new byte[] { 10, 5, 48, 72, 14, 2, 88, 46 };

  System.Diagnostics.Trace.WriteLine(BitConverter.ToString(data).Replace("-",","));

  输出结果:0A,05,30,48,0E,02,58,2E

3、字节数组截取

  byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  如果截取2位、4位或者8位长度的字节数组,可以分别用 BitConverter.ToInt16、BitConverter.ToInt32、BitConverter.ToInt64截取,例如,从第3位开始截取4个字节则 BitConverter.ToInt32(data,3);

  如果截取的位数不规则,则使用另一种方法,例如,从第5位开始截取3个字节则 data.Skip(5).Take(3).ToArray();

 4、List<>集合中同一元素判断

  List.Exists(obj => obj =="XXX"){};

5、保留一位小数

  float ff = 1.01f;

  a、string value = ff.ToString("0.0"); 或者value = ff.ToString("#0.0"); #:用#代表实际位数 0:用0填充不足的位数(0的位置表示必须有,如果没有用0填充,#的位置表示可有可无)

  b、string value = String.Format("{0:F1}",ff);

6、socket创建失败

  Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

  提示:以一种访问权限不允许的方式做了一个访问套接字的尝试,原因是由于软件没有以管理员的方式打开造成

7、IOControl(IOControlCode ioControlCode, byte[] optionInValue, byte[] optionOutValue)中的参数

  ioControlCode:一个 IOControlCode 值,它指定要执行的操作的控制代码

  optionInValue:

  在C++中第二个参数不是数组而是结构体:

  struct tcp_keepalive 

  {

     u_long  onoff; //是否启用Keep-Alive

    u_long  keepalivetime; //多长时间后开始第一次探测(单位:毫秒)

    u_long  keepaliveinterval; //探测时间间隔(单位:毫秒)

  }

  optionOutValue:包含由操作返回的输出数据

 8、SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue)中的参数

  optionLevel:SocketOptionLevel 值之一(参考MSDN)

  optionName:SocketOptionName 值之一(参考MSDN)

  optionValue:参传一个非零值,也可以传True,如果要禁用的话,就传 False

 9、Windows上没法用socket抓MAC层的数据,只能用raw socket抓到IP层及之上的数据

10、网络字节序

  网络字节序一般是指大端传输

  大小端概念:

  大端(Big-Endian),小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到,其中网络字节序(Network Byte Order)一般是指大端(Big-Endian,对大部分网络传输协议而言)传输,大端小端的概念是面向多字节数据类型的存储方式定义的,小端就是低位在前(低位字节存在内存低地址,字节高低顺序和内存高低地址顺序相同),大端就是高位在前,(其中“前”是指靠近内存低地址,存储在硬盘上就是先写那个字节)。概念上字节序也叫主机序

  •   大小端是面向多字节类型定义的,比如2字节、4字节、8字节整型、长整型、浮点型等,单字节的字符串一般不用考虑
  •   大端小端存储、传输、以及接收处理需要对应
  •   大端(Big-Endian)就是高字节(MSB)在前,内存存储体现上,数据的高位更加靠近低地址
  •   小端(Little-Endian)就是低字节(LSB)在前,内存存储体现上,数据的低位更加靠近低地址

  c#中已经提供了网络转主机,主机转网络的字节序的函数:IPAddress.HostToNetworkOrder、IPAddress.NetworkToHostOrder

11、去掉字符串中的某些字符

  String.Replace:str = str.Replace(" ", string.Empty).Replace(" ", string.Empty).Replace(" ", string.Empty);

  Regex.Replace:str = Regex.Replace(str, "[ ]", string.Empty, RegexOptions.Compiled);

12、系统时间获取格式

  System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff"); 如:2011-7-18 15:05:32 956 

13、静态锁与非静态锁

  private static readonly object Locker1 = new object();

  private readonly object Locker2 = new object();

  单实例非静态锁,线程没有并发(加锁成功);

  单实例静态所,线程没有并发(加锁成功);

  多实例非静态所,线程并发(加锁失败);

  多实例静态所,线程没有并发(加锁成功)

原文地址:https://www.cnblogs.com/yeshenmeng/p/9705752.html