Files
YuPu-OrpaonEMS/OrpaonEMS.App/Com/ConvertHelper.cs
2025-02-28 22:23:13 +08:00

238 lines
7.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}