using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace WWPipeLine.Commons
{
///
/// 编码转换类
///
public class EncodeHelper
{
private EncodeHelper()
{
}
#region 判断文件流是否为UTF8字符集
///
/// 判断文件流是否为UTF8字符集
///
/// 文件流
/// 判断结果
public static bool IsUTF8(FileStream sbInputStream)
{
int i;
byte cOctets; // octets to go in this UTF-8 encoded character
byte chr;
bool bAllAscii = true;
long iLen = sbInputStream.Length;
cOctets = 0;
for (i = 0; i < iLen; i++)
{
chr = (byte)sbInputStream.ReadByte();
if ((chr & 0x80) != 0) bAllAscii = false;
if (cOctets == 0)
{
if (chr >= 0x80)
{
do
{
chr <<= 1;
cOctets++;
}
while ((chr & 0x80) != 0);
cOctets--;
if (cOctets == 0) return false;
}
}
else
{
if ((chr & 0xC0) != 0x80)
{
return false;
}
cOctets--;
}
}
if (cOctets > 0)
{
return false;
}
if (bAllAscii)
{
return false;
}
return true;
}
#endregion 判断文件流是否为UTF8字符集
#region GB2312转换成UTF-8
///
/// 将GB2312转换成UTF-8
///
///
///
public static string GB2312ToUTF8(string content)
{
byte[] _byteData = GetDefaultByte(content);
return Encoding.UTF8.GetString(_byteData);
}
#endregion GB2312转换成UTF-8
#region 将字符串转换默认的Byte数组
///
/// 将字符串转换默认的Byte数组
///
///
///
public static byte[] GetDefaultByte(string content)
{
return Encoding.Default.GetBytes(content);
}
#endregion 将字符串转换默认的Byte数组
#region 文件转化为Base64
///
/// 文件转化为Base64
///
/// 文件路径
/// Base64
public string FileToBase64String(string path)
{
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, (int)fileStream.Length);
fileStream.Close();
fileStream.Dispose();
MemoryStream memory = new MemoryStream(buffer);
string base64 = Convert.ToBase64String(memory.ToArray());
memory.Close();
memory.Dispose();
return base64;
}
#endregion 文件转化为Base64
#region 图象转化为Base64
///
/// 图象转化为Base64
///
/// 图象路径
/// 图象格式
/// Base64
//public string ImageToBase64String(Image image, ImageFormat format)
//{
// MemoryStream memory = new MemoryStream();
// image.Save(memory, image.RawFormat);
// string base64 = Convert.ToBase64String(memory.ToArray());
// memory.Close();
// memory.Dispose();
// return base64;
//}
#endregion 图象转化为Base64
#region Base64转化为图象
///
/// Base64转化为图象
///
/// Base64
/// 图象
//public Image ImageFromBase64String(string base64)
//{
// MemoryStream memory = new MemoryStream(Convert.FromBase64String(base64));
// Image result = Image.FromStream(memory);
// memory.Close();
// memory.Dispose();
// return result;
//}
#endregion Base64转化为图象
#region 图标转化为Base64
///
/// 图标转化为Base64
///
/// 图标
/// Base64
//public string IconToBase64String(Icon image)
//{
// MemoryStream memory = new MemoryStream();
// image.Save(memory);
// string base64 = Convert.ToBase64String(memory.ToArray());
// memory.Close();
// memory.Dispose();
// return base64;
//}
#endregion 图标转化为Base64
#region Base64转化为图标
///
/// Base64转化为图标
///
/// Base64
/// 图标
//public Icon IconFromBase64String(string base64)
//{
// MemoryStream memory = new MemoryStream(Convert.FromBase64String(base64));
// Icon result = new Icon(memory);
// memory.Close();
// memory.Dispose();
// return result;
//}
#endregion Base64转化为图标
#region IP 协议采用统一的校验算法
///
/// IP 协议采用统一的校验算法
///
/// buffer数组为整个ip包数组,需要转换成UInt16[]
/// size为buffer数组的长度
/// 结果为0则数据正确,不为0表示通讯出错
public static UInt16 checksum(UInt16[] buffer, int size)
{
Int32 cksum = 0;
int counter;
counter = 0;
while (size > 0)
{
UInt16 val = buffer[counter];
cksum += Convert.ToInt32(buffer[counter]);
counter += 1;
size = -1;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (UInt16)(~cksum);
}
#endregion IP 协议采用统一的校验算法
#region 生成字符串的ascii代码
///
/// 生成字符串的ascii代码
///
/// 中文字符串,可夹英文
///
public static string Gen_ASCII(string s_Chinese)
{
string str = "";
for (int i = 0; i < s_Chinese.Length; i++)
{
char ch = s_Chinese[i];
if ((ch != '\r') && (ch != '\n'))
{
str = str + ((short)ch).ToString("X");
}
}
return str;
}
///
/// 生成字符串的ascii代码
///
/// 中文字符串,可夹英文
///
public static string Get_ASCII(string s_Chinese)
{
string str = "";
byte[] array = Encoding.ASCII.GetBytes(s_Chinese);
for (int i = 0; i < array.Length; i++)
{
int asciicode = (int)(array[i]);
if (asciicode > 63)
{
asciicode -= 64;
}
else
{
asciicode += 64;
}
str += Convert.ToString(asciicode);
}
return str;
}
///
/// 生成ascii代码的字符串
///
/// ascii代码 { 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 114, 105, 110, 103, 46 }
///
public static string Get_ASCII(byte[] ByteArray)
{
ASCIIEncoding AE = new ASCIIEncoding();
string strAsc = AE.GetString(ByteArray);
return strAsc;
}
#endregion 生成字符串的ascii代码
#region 生成ascii代码的字符数组
///
/// 生成ascii代码的字符数组
///
/// ascii代码 { 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 114, 105, 110, 103, 46 }
///
public static char[] Gen_ASCII(byte[] ByteArray)
{
ASCIIEncoding AE = new ASCIIEncoding();
char[] CharArray = AE.GetChars(ByteArray);
return CharArray;
}
#endregion 生成ascii代码的字符数组
#region 字节数组转16进制字符串
///
/// 字节数组转16进制字符串
///
///
///
public static string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2") + " ";
}
}
return returnStr;
}
///
/// 字节数组转16进制字符串
///
///
///
public static string byteToHexStrTrim(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
#endregion 字节数组转16进制字符串
#region 字符串转16进制字节数组
///
/// 字符串转16进制字节数组
///
///
///
public static byte[] strToToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
#endregion 字符串转16进制字节数组
#region 16进制字符串异或
///
/// 16进制字符串异或
///
///
///
public static string str16Xor(string hexString)
{
string returnStr = "";
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte XorByte = 0;
for (int i = 0; i < hexString.Length / 2; i++)
XorByte ^= Convert.ToByte(hexString.Substring(i * 2, 2), 16);
byte[] strAry = Encoding.ASCII.GetBytes(XorByte.ToString("X"));
returnStr = EncodeHelper.byteToHexStr(strAry);
return returnStr;
}
#endregion 16进制字符串异或
#region 转全角\半角的函数
///
/// 转全角的函数(SBC case)
///
///任意字符串
///全角字符串
///
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///
/// 任意字符串
///
public static String ToSBC(String input)
{
// 半角转全角:
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 32)
{
c[i] = (char)12288;
continue;
}
if (c[i] < 127)
c[i] = (char)(c[i] + 65248);
}
return new String(c);
}
///
///
/// 转半角的函数(DBC case)
///
///任意字符串
///半角字符串
///
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///
///
///
public static String ToDBC(String input)
{
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 12288)
{
c[i] = (char)32;
continue;
}
if (c[i] > 65280 && c[i] < 65375)
c[i] = (char)(c[i] - 65248);
}
return new String(c);
}
#endregion 转全角\半角的函数
#region 是否全角\半角
///
/// 是否全角的函数(SBC case)
///
///任意字符串
///全角字符串
///
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///
/// 任意字符串
///
public static bool IsSBC(string input)
{
if (2 * input.Length == Encoding.Default.GetByteCount(input))
{
return true;
}
else
{
return false;
}
}
///
/// 是否半角的函数(DBC case)
///
///任意字符串
///全角字符串
///
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///
/// 任意字符串
///
public static bool IsDBC(string input)
{
if (input.Length == Encoding.Default.GetByteCount(input))
{
return true;
}
else
{
return false;
}
}
#endregion 是否全角\半角
#region 转换Image到byte[] 数组
/////
///// 转换Image到byte[] 数组
/////
///// Image
///// byte[] 数组
//public static byte[] imageToByteArray(System.Drawing.Image imageIn)
//{
// MemoryStream ms = new MemoryStream();
// imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
// byte[] returnBuffer = new byte[ms.Length];
// ms.Read(returnBuffer, 0, int.Parse(ms.Length.ToString()));
// //清空和释放内存流
// ms.Close();
// ms.Dispose();
// return returnBuffer;
//}
#endregion 转换Image到byte[] 数组
#region 转换byte[]到Image
/////
///// 转换byte[]到Image
/////
///// byte[] 数组
///// Image
//public static Image byteArrayToImage(byte[] byteArrayIn)
//{
// MemoryStream ms = new MemoryStream(byteArrayIn);
// Image returnImage = Image.FromStream(ms);
// ms.Close();
// ms.Dispose();
// return returnImage;
//}
#endregion 转换byte[]到Image
#region 将字节数组转换成字符串
///
/// 将字节数组转换成字符串
///
/// 字节数组
/// 返回转换后的字符串
public static string byteToString(byte[] b)
{
Encoding enc = Encoding.GetEncoding("GB2312");
string str = enc.GetString(b);
str = str.Substring(0, str.IndexOf('\0') >= 0 ? str.IndexOf('\0') : str.Length);//去掉无用字符
return str;
}
#endregion 将字节数组转换成字符串
#region 编码方式转换
public static string StringToBitString(string input)
{
return StringToBitString(input, Encoding.Default);
}
public static string StringToBitString(string input, Encoding encoding)
{
byte[] stringBytes = encoding.GetBytes(input);
StringBuilder result = new StringBuilder(stringBytes.Length * 8);
foreach (byte b in stringBytes)
{
for (int i = 128; i > 0; i /= 2)
{
result.Append(((b & i) == 0) ? 0 : 1);
}
}
return result.ToString();
}
public static string BitStringToString(string input)
{
return BitStringToString(input, Encoding.Default);
}
public static string BitStringToString(string input, Encoding encoding)
{
List byteArray = new List();
byte temp = 0;
for (int i = 0, j = 0; i < input.Length; i++)
{
if (input[i] == '1') temp |= (byte)(1 << (8 - i % 8 - 1));
if (++j == 8)
{
byteArray.Add(temp);
temp = 0;
j = 0;
}
}
string result = new string(encoding.GetChars(byteArray.ToArray()));
return result;
}
#endregion 编码方式转换
#region int byte 互转
///
/// byte 转int
///
///
///
public static int BytesToInt(byte[] bytesData)
{
int num = 0;
for (int i = 0; i < bytesData.Length; i++)
{
num += bytesData[i] << (8 * i);
}
return num;
}
///
/// bytes转int
///
/// 自己数据
/// 偏移量
/// 字节长度最大为4最小为1,如果length 大于4或小于1 内部赋值为2
/// int值
public static int BytesToInt(byte[] bytesData, int offset, int length = 4)
{
int num = 0;
if (length < 1 || length > 4)
{
length = 2;
}
for (int i = 0; i < length; i++)
{
num += bytesData[i + offset] << (8 * i);
}
return num;
}
///
/// int转byte
///
///
/// 字节长度最大为4最小为1,如果length 大于4或小于1 内部赋值为2
///
public static byte[] IntToBytes(int data, int length = 4)
{
if (length < 1 || length > 4)
{
length = 2;
}
byte[] buffer = new byte[length];
for (int i = 0; i < length; i++)
{
buffer[i] = (byte)(data >> (i * 8));
}
return buffer;
}
#endregion int byte 互转
#region Color 转为short
///
/// 将Color转为Short类型
///
///
///
//public static short ColorToShort(Color color)
//{
// return (short)(((color.R & 0xf8) << 8)
// | ((color.G & 0xfc) << 3)
// | ((color.B & 0xf8) >> 3));//红高5,绿高6,蓝高5
//}
#endregion Color 转为short
}
}