345 lines
11 KiB
C#
345 lines
11 KiB
C#
namespace LSServerService
|
|
{
|
|
using LSUtils;
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
|
|
public class PubUtils
|
|
{
|
|
public static readonly PubUtils Instance = new PubUtils();
|
|
|
|
private PubUtils()
|
|
{
|
|
}
|
|
|
|
public static byte[] BytesAddStruct(byte[] bytesHead, object structObj)
|
|
{
|
|
byte[] src = StructToBytes(structObj);
|
|
if ((bytesHead == null) || (bytesHead.Length <= 0))
|
|
{
|
|
return src;
|
|
}
|
|
int num = bytesHead.Length + src.Length;
|
|
byte[] dst = new byte[num];
|
|
Buffer.BlockCopy(bytesHead, 0, dst, 0, bytesHead.Length);
|
|
Buffer.BlockCopy(src, 0, dst, bytesHead.Length, src.Length);
|
|
return dst;
|
|
}
|
|
|
|
public static byte[] BytesAddStruct(object structObj, byte[] bytesTail)
|
|
{
|
|
byte[] src = StructToBytes(structObj);
|
|
if ((bytesTail == null) || (bytesTail.Length <= 0))
|
|
{
|
|
return src;
|
|
}
|
|
int num = src.Length + bytesTail.Length;
|
|
byte[] dst = new byte[num];
|
|
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
|
|
Buffer.BlockCopy(bytesTail, 0, dst, src.Length, bytesTail.Length);
|
|
return dst;
|
|
}
|
|
|
|
public static byte[] BytesIntercept(byte[] SrcBytes, uint FixedLen)
|
|
{
|
|
byte[] dst = new byte[FixedLen];
|
|
int count = (SrcBytes.Length > FixedLen) ? ((int) FixedLen) : SrcBytes.Length;
|
|
Buffer.BlockCopy(SrcBytes, 0, dst, 0, count);
|
|
return dst;
|
|
}
|
|
|
|
public static string BytesToStr(byte[] SrcBytes)
|
|
{
|
|
return Encoding.Default.GetString(SrcBytes).Replace("\0", "");
|
|
}
|
|
|
|
public static string BytesToStr(byte[] SrcBytes, int index, int count)
|
|
{
|
|
return Encoding.Default.GetString(SrcBytes, index, count).Replace("\0", "");
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType)
|
|
{
|
|
return BytesToStruct(bytes, structType, 0, 0);
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex)
|
|
{
|
|
return BytesToStruct(bytes, structType, startIndex, 0);
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, string ExceptField)
|
|
{
|
|
return BytesToStruct(bytes, structType, 0, 0, new string[] { ExceptField });
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, string[] ExceptFields)
|
|
{
|
|
return BytesToStruct(bytes, structType, 0, 0, ExceptFields);
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex, int decCount)
|
|
{
|
|
object obj2 = null;
|
|
int num = 1;
|
|
int num2 = 0;
|
|
int num3 = 0;
|
|
while (num > 0)
|
|
{
|
|
int cb = Marshal.SizeOf(structType);
|
|
IntPtr destination = Marshal.AllocHGlobal(cb);
|
|
try
|
|
{
|
|
num3 = 0;
|
|
Marshal.Copy(bytes, startIndex, destination, cb - decCount);
|
|
num3 = 1;
|
|
obj2 = Marshal.PtrToStructure(destination, structType);
|
|
num3 = 2;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
WriteLog("PubUtils.BytesToStruct error is {0},size={1},startIndex={2},decCount={3},bError={4},LinePos={5},bytes is:\n{6}", new object[] { exception.Message.ToString(), cb, startIndex, decCount, num2, num3, bytes });
|
|
num++;
|
|
if (num2 > 2)
|
|
{
|
|
throw new Exception(exception.Message.ToString());
|
|
}
|
|
num2++;
|
|
}
|
|
finally
|
|
{
|
|
Marshal.FreeHGlobal(destination);
|
|
}
|
|
num--;
|
|
}
|
|
return obj2;
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex, string ExceptField)
|
|
{
|
|
return BytesToStruct(bytes, structType, startIndex, 0, new string[] { ExceptField });
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex, string[] ExceptFields)
|
|
{
|
|
return BytesToStruct(bytes, structType, startIndex, 0, ExceptFields);
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex, int decCount, string ExceptField)
|
|
{
|
|
return BytesToStruct(bytes, structType, startIndex, decCount, new string[] { ExceptField });
|
|
}
|
|
|
|
public static object BytesToStruct(byte[] bytes, Type structType, int startIndex, int decCount, string[] ExceptFields)
|
|
{
|
|
object obj3;
|
|
try
|
|
{
|
|
string str = "|";
|
|
for (int i = 0; i < ExceptFields.Length; i++)
|
|
{
|
|
str = str + ExceptFields[i] + "|";
|
|
}
|
|
int dstOffset = 0;
|
|
int num3 = Marshal.SizeOf(structType) - decCount;
|
|
byte[] buffer = new byte[num3];
|
|
object obj2 = BytesToStruct(buffer, structType);
|
|
FieldInfo[] fields = structType.GetFields();
|
|
foreach (FieldInfo info in fields)
|
|
{
|
|
int count = 0;
|
|
if (info.FieldType.IsArray)
|
|
{
|
|
Array array = (Array) info.GetValue(obj2);
|
|
count = array.Length;
|
|
}
|
|
else
|
|
{
|
|
count = Marshal.SizeOf(info.FieldType);
|
|
}
|
|
string str2 = "|" + info.Name + "|";
|
|
if (!str.Contains(str2))
|
|
{
|
|
Buffer.BlockCopy(bytes, startIndex, buffer, dstOffset, count);
|
|
startIndex += count;
|
|
}
|
|
dstOffset += count;
|
|
}
|
|
obj3 = BytesToStruct(buffer, structType);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
WriteLog("PubUtils.BytesToStruct error: {0},bytes is :\n{1} \n,ExceptFields is \n{2}", new object[] { exception.Message.ToString(), bytes, ExceptFields });
|
|
throw new Exception(exception.Message.ToString());
|
|
}
|
|
return obj3;
|
|
}
|
|
|
|
public static byte[] ComposeTwoBytes(byte[] bytesHead, byte[] bytesTail)
|
|
{
|
|
int num = bytesHead.Length + bytesTail.Length;
|
|
byte[] dst = new byte[num];
|
|
Buffer.BlockCopy(bytesHead, 0, dst, 0, bytesHead.Length);
|
|
Buffer.BlockCopy(bytesTail, 0, dst, bytesHead.Length, bytesTail.Length);
|
|
return dst;
|
|
}
|
|
|
|
public static byte[] CopyArrayData(byte[] source, int startIndex, int length)
|
|
{
|
|
byte[] buffer = new byte[length];
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
buffer[i] = source[startIndex + i];
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
public static void CopyStructToBytes(object structObj, byte[] destBytes, int dstOffset)
|
|
{
|
|
int cb = Marshal.SizeOf(structObj);
|
|
IntPtr ptr = Marshal.AllocHGlobal(cb);
|
|
try
|
|
{
|
|
Marshal.StructureToPtr(structObj, ptr, false);
|
|
Marshal.Copy(ptr, destBytes, dstOffset, cb);
|
|
}
|
|
finally
|
|
{
|
|
Marshal.FreeHGlobal(ptr);
|
|
}
|
|
}
|
|
|
|
public static IPAddress GetServerIP()
|
|
{
|
|
IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
|
|
foreach (IPAddress address in hostEntry.AddressList)
|
|
{
|
|
if (address.AddressFamily == AddressFamily.InterNetwork)
|
|
{
|
|
return address;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static uint IPToLong(string strIP)
|
|
{
|
|
return (uint) IPAddress.Parse(strIP).Address;
|
|
}
|
|
|
|
public static string LongToIP(uint dwIP)
|
|
{
|
|
return new IPAddress((long) dwIP).ToString();
|
|
}
|
|
|
|
public static string ReadXmlStr(string SrcStr)
|
|
{
|
|
return SrcStr.Replace("<", "<").Replace(">", ">").Replace("&", "&").Replace("'", "'").Replace(""", "\"");
|
|
}
|
|
|
|
public static byte[] StrToBytes(string SrcString)
|
|
{
|
|
return Encoding.Default.GetBytes(SrcString);
|
|
}
|
|
|
|
public static byte[] StrToBytes(string SrcString, uint FixedLen)
|
|
{
|
|
return StrToBytes(SrcString.ToCharArray(), FixedLen);
|
|
}
|
|
|
|
public static byte[] StrToBytes(char[] SrcChar, uint FixedLen)
|
|
{
|
|
return BytesIntercept(Encoding.Default.GetBytes(SrcChar), FixedLen);
|
|
}
|
|
|
|
public static byte[] StructToBytes(object structObj)
|
|
{
|
|
byte[] buffer2;
|
|
int cb = Marshal.SizeOf(structObj);
|
|
IntPtr ptr = Marshal.AllocHGlobal(cb);
|
|
try
|
|
{
|
|
Marshal.StructureToPtr(structObj, ptr, false);
|
|
byte[] destination = new byte[cb];
|
|
Marshal.Copy(ptr, destination, 0, cb);
|
|
buffer2 = destination;
|
|
}
|
|
finally
|
|
{
|
|
Marshal.FreeHGlobal(ptr);
|
|
}
|
|
return buffer2;
|
|
}
|
|
|
|
public static byte[] StructToBytes(object structObj, int decCount)
|
|
{
|
|
byte[] buffer2;
|
|
int cb = Marshal.SizeOf(structObj);
|
|
IntPtr ptr = Marshal.AllocHGlobal(cb);
|
|
try
|
|
{
|
|
Marshal.StructureToPtr(structObj, ptr, false);
|
|
byte[] destination = new byte[cb - decCount];
|
|
Marshal.Copy(ptr, destination, 0, cb - decCount);
|
|
buffer2 = destination;
|
|
}
|
|
finally
|
|
{
|
|
Marshal.FreeHGlobal(ptr);
|
|
}
|
|
return buffer2;
|
|
}
|
|
|
|
public static void WriteLog(string ErrMsg, params object[] args)
|
|
{
|
|
LSWriteLog.WriteLog("sysError.log", ErrMsg, args);
|
|
Win32Exception exception = new Win32Exception();
|
|
LSWriteLog.WriteLog("sysError.log", "Win32Exception= {0}", new object[] { exception });
|
|
exception = null;
|
|
}
|
|
|
|
public static string WriteXmlStr(string SrcStr)
|
|
{
|
|
return SrcStr.Replace("<", "<").Replace(">", ">").Replace("&", "&").Replace("'", "'").Replace("\"", """);
|
|
}
|
|
|
|
public static IPAddress LocalFirstIPAddr
|
|
{
|
|
get
|
|
{
|
|
return Dns.Resolve(LocalMachineName).AddressList[0];
|
|
}
|
|
}
|
|
|
|
public static uint LocalFirstIPLong
|
|
{
|
|
get
|
|
{
|
|
return (uint) LocalFirstIPAddr.Address;
|
|
}
|
|
}
|
|
|
|
public static string LocalFirstIPStr
|
|
{
|
|
get
|
|
{
|
|
return LocalFirstIPAddr.Address.ToString();
|
|
}
|
|
}
|
|
|
|
public static string LocalMachineName
|
|
{
|
|
get
|
|
{
|
|
return Environment.MachineName;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|