238 lines
7.3 KiB
C#
238 lines
7.3 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Runtime.InteropServices;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace OrpaonEMS.App.Com
|
||
{
|
||
/// <summary>
|
||
/// 处理数据类型转换,数制转换、编码转换相关的类
|
||
/// </summary>
|
||
public sealed class ConvertHelper
|
||
{
|
||
#region 补足位数
|
||
/// <summary>
|
||
/// 指定字符串的固定长度,如果字符串小于固定长度,
|
||
/// 则在字符串的前面补足零,可设置的固定长度最大为9位
|
||
/// </summary>
|
||
/// <param name="text">原始字符串</param>
|
||
/// <param name="limitedLength">字符串的固定长度</param>
|
||
public static string RepairZero(string text, int limitedLength)
|
||
{
|
||
//补足0的字符串
|
||
string temp = "";
|
||
|
||
//补足0
|
||
for (int i = 0; i < limitedLength - text.Length; i++)
|
||
{
|
||
temp += "0";
|
||
}
|
||
|
||
//连接text
|
||
temp += text;
|
||
|
||
//返回补足0的字符串
|
||
return temp;
|
||
}
|
||
#endregion
|
||
|
||
#region 各进制数间转换
|
||
|
||
/// <summary>
|
||
/// 实现各进制数间的转换。
|
||
/// </summary>
|
||
/// <param name="value">要转换的值,即原值</param>
|
||
/// <param name="from">原值的进制,只能是2,8,10,16四个值。</param>
|
||
/// <param name="to">要转换到的目标进制,只能是2,8,10,16四个值。</param>
|
||
/// <returns>转换失败返回“0”</returns>
|
||
/// <example>
|
||
/// ConvertBase("15",10,16); 表示将十进制数15转换为16进制的数。
|
||
/// </example>
|
||
public static string ConvertBase(string value, int from, int to)
|
||
{
|
||
try
|
||
{
|
||
int intValue = Convert.ToInt32(value, from); //先转成10进制
|
||
string result = Convert.ToString(intValue, to); //再转成目标进制
|
||
|
||
if (to == 2)
|
||
{
|
||
result = result.PadLeft(8, '0');
|
||
}
|
||
|
||
return result;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine(ex);
|
||
return "0";
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 使用指定字符集将string转换成byte[]
|
||
/// <summary>
|
||
/// 使用指定字符集将string转换成byte[]
|
||
/// </summary>
|
||
/// <param name="text">要转换的字符串</param>
|
||
/// <param name="encoding">字符编码</param>
|
||
public static byte[] StringToBytes(string text, Encoding encoding)
|
||
{
|
||
return encoding.GetBytes(text);
|
||
}
|
||
#endregion
|
||
|
||
#region byte[]转string
|
||
|
||
/// <summary>
|
||
/// 使用指定字符集将byte[]转换成string
|
||
/// </summary>
|
||
/// <param name="bytes">要转换的字节数组</param>
|
||
/// <param name="encoding">字符编码</param>
|
||
public static string BytesToString(byte[] bytes, Encoding encoding)
|
||
{
|
||
return encoding.GetString(bytes);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 从字节数组生成字符串;
|
||
/// </summary>
|
||
/// <param name="buffer"></param>
|
||
/// <returns></returns>
|
||
public string GetBufferStr(byte[] buffer)
|
||
{
|
||
//byte SEP = 0xB3 /*分隔符|*/;
|
||
|
||
string result = "";
|
||
for (int i = 0; i < buffer.Length; i++)
|
||
{
|
||
switch (buffer[i])
|
||
{
|
||
//case SEP:
|
||
// result += "|";
|
||
// break;
|
||
default:
|
||
string str = (char)buffer[i] + "";
|
||
if (!string.IsNullOrEmpty(str))
|
||
{
|
||
result += str;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 将byte[]转换成int
|
||
/// <summary>
|
||
/// 将byte[]转换成int
|
||
/// </summary>
|
||
/// <param name="data">需要转换成整数的byte数组</param>
|
||
public static int BytesToInt32(byte[] data)
|
||
{
|
||
//如果传入的字节数组长度小于4,则返回0
|
||
if (data.Length < 4)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
//定义要返回的整数
|
||
int num = 0;
|
||
|
||
//如果传入的字节数组长度大于4,需要进行处理
|
||
if (data.Length >= 4)
|
||
{
|
||
//创建一个临时缓冲区
|
||
byte[] tempBuffer = new byte[4];
|
||
|
||
//将传入的字节数组的前4个字节复制到临时缓冲区
|
||
Buffer.BlockCopy(data, 0, tempBuffer, 0, 4);
|
||
|
||
//将临时缓冲区的值转换成整数,并赋给num
|
||
num = BitConverter.ToInt32(tempBuffer, 0);
|
||
}
|
||
|
||
//返回整数
|
||
return num;
|
||
}
|
||
#endregion
|
||
|
||
#region struct和byte[]互转
|
||
|
||
public static byte[] StructToBytes(object structObj)
|
||
{
|
||
int size = Marshal.SizeOf(structObj);
|
||
IntPtr buffer = Marshal.AllocHGlobal(size);
|
||
try
|
||
{
|
||
Marshal.StructureToPtr(structObj, buffer, false);
|
||
byte[] bytes = new byte[size];
|
||
Marshal.Copy(buffer, bytes, 0, size);
|
||
return bytes;
|
||
}
|
||
finally
|
||
{
|
||
Marshal.FreeHGlobal(buffer);
|
||
}
|
||
}
|
||
|
||
public static T BytesToStruct<T>(byte[] data)
|
||
{
|
||
IntPtr buffer = Marshal.AllocHGlobal(data.Length);
|
||
try
|
||
{
|
||
Marshal.Copy(data, 0, buffer, data.Length);
|
||
return Marshal.PtrToStructure<T>(buffer);
|
||
}
|
||
finally
|
||
{
|
||
Marshal.FreeHGlobal(buffer);
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 通用类型转换
|
||
/// http://www.dzwebs.net/4343.html
|
||
/// </summary>
|
||
/// <param name="value">值</param>
|
||
/// <param name="type">类型</param>
|
||
/// <returns>object</returns>
|
||
public static object ChangeType(object value, Type type)
|
||
{
|
||
if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
|
||
if (value == null) return null;
|
||
if (type == value.GetType()) return value;
|
||
if (type.IsEnum)
|
||
{
|
||
if (value is string)
|
||
return Enum.Parse(type, value as string);
|
||
else
|
||
return Enum.ToObject(type, value);
|
||
}
|
||
|
||
if (!type.IsInterface && type.IsGenericType)
|
||
{
|
||
Type innerType = type.GetGenericArguments()[0];
|
||
object innerValue = ChangeType(value, innerType);
|
||
return Activator.CreateInstance(type, new object[] { innerValue });
|
||
}
|
||
|
||
if (value is string && type == typeof(Guid)) return new Guid(value as string);
|
||
if (value is string && type == typeof(Version)) return new Version(value as string);
|
||
|
||
//自定义类转换会在这句返回;
|
||
if (!(value is IConvertible)) return value;
|
||
|
||
return Convert.ChangeType(value, type);
|
||
}
|
||
}
|
||
}
|