转:C#数字、16进制字符串和字节之间互转 bin2hex

一个字节包含8个二进制位,一个十六进制可表示4个二进制位,所以,一个字节可以由2个十六进制表示

总结如下: 
(1)一个byte 对应两位十六进制位,而不是八位(32位二进制位); 
(2)转化为十六进制之后,不足两位的,高位要补零。


8位十六进制数占多少字节 比如0x12345678这是多少字节?

一位十六进制代表四位二进制,0x12345678转换成二进制就是0001-0010-0011-0100-0101-0110-0111- 1000而没八位二进制占一个字节,所以你 8位十六进制数占4字节

16进制中,两个字符是一个字节,一个字符的话,是一个字节。

例如:A是一个字节,AA是一个字节,AAA是两个字节,AAAA是两个字节。

不过,16进制能够出现的字符(不区分大小写)是:1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F

6e69 占用 两个字节


1、数字和字节之间互转

int num=12345;
byte[] bytes=BitConverter.GetBytes(num);//将int32转换为字节数组
num=BitConverter.ToInt32(bytes,0);//将字节数组内容再转成int32类型

2、将字符串转为16进制字符,允许中文
private string StringToHexString(string s, Encoding encode)
{
byte[] b =  System.Text.Encoding.Default.GetBytes(s);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
{
result+= Convert.ToString(b[i], 16);
}

//将得到的结果重新转换成字符(包含中文)

string strTemp = "";
                b = new byte[restult.Length / 2];
                for (int i = 0; i < b.Length; i++)
                {
                    strTemp = restult.Substring(i * 2, 2);
                    b[i] = Convert.ToByte(strTemp, 16);
                }

string strChar=System.Text.Encoding.Default.GetString(b);
return result;
}

如:
///注意,一个中文转为utf-8占三个字节,英文占一个字节
System.Console.WriteLine(StringToHexString("中华人民共和国", System.Text.Encoding.UTF8));

或使用
BitConverter.ToString(Encoding.UTF8.GetBytes("中华人民共和国"))

返回结果为XX-XX-XX

然后再去掉”-“

3、将16进制字符串转为字符串
private string HexStringToString(string hs, Encoding encode)
{
string strTemp="";
byte[] b=new byte[hs.Length/2];
for (int i = 0; i < hs.Length / 2; i++)
{
strTemp = hs.Substring(i * 2, 2);
b[i] = Convert.ToByte(strTemp, 16);
}
//按照指定编码将字节数组变为字符串
return encode.GetString(b);
}

如:
string hexstring= StringToHexString("中华人民共和国", System.Text.Encoding.UTF8);
string content=HexStringToString(hexstring, System.Text.Encoding.UTF8)

4、将byte[]转为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");

// returnStr += Convert.ToString(b[i], 16);
}
}
return returnStr;
}

  •  

ToString("X2") 为C#中的字符串格式控制符

X为 十六进制 
2为 每次都是两位数

比如 0x0A ,若没有2,就只会输出0xA 
假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定”X2”,这样显示出来就是:0x0A、0x1A


5、将16进制的字符串转为byte[]
private 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;
}
6、二进制数组转十六进制字符串 (已优化):bin2hex
        private static String byte2hex(byte[] result)
        {
            StringBuilder sb = new StringBuilder(result.Length * 2);
            for (int i = 0; i < result.Length; i++)
            {
                int hight = ((result[i] >> 4) & 0x0f);
                int low = result[i] & 0x0f;
                sb.Append(hight > 9 ? (char)((hight - 10) + 'a') : (char)(hight + '0'));
                sb.Append(low > 9 ? (char)((low - 10) + 'a') : (char)(low + '0'));
            }
            return sb.ToString();
        }

 

        #region 
        ///


        /// 字节数组转成字符
        ///

        ///
        ///
        ///
        private static String byteToChar(int length, byte[] data)
        {
            StringBuilder stringbuiler = new StringBuilder();
            for (int i = 0; i < length; i++)
            {
                String temp = data[i].ToString("x");
                if (temp.Length == 1)
                {
                    stringbuiler.Append("0" + temp);
                }
                else
                {
                    stringbuiler.Append(temp);
                }
            }
            return (stringbuiler.ToString());
        }

        ///


        /// 字符串转16进制字节数组
        ///

        ///
        ///
        private 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

        #region 
        ///


        /// 将汉字转成16进制字符
        ///

        ///
        ///
        private static string ChinaToByte(string sCarNum)
        {
            string CarNumHex = "";
            for (int iCnt = 0; iCnt < sCarNum.Length; iCnt++)
            {
                string sChina = sCarNum.Substring(iCnt, 1);
                byte[] bChina = System.Text.Encoding.Unicode.GetBytes(sChina);
                sChina = String.Format("{0:X2}{1:X2}", bChina[0], bChina[1]);
                CarNumHex += sChina;
            }
            return CarNumHex;
        }
        ///
        /// 将16进制转成汉字
        ///

        ///
        private static string ByteToChina(string _hexStr)
        {
            string sCarNum = "";
            for (int iCnt = 0; iCnt < _hexStr.Length; iCnt += 4)
            {
                byte[] bCode = { Convert.ToByte( _hexStr.Substring( iCnt, 2 ), 16 ),
                                   Convert.ToByte( _hexStr.Substring( iCnt + 2, 2 ), 16 ) };
                string sChina = System.Text.Encoding.Unicode.GetString(bCode);
                sCarNum += sChina;
            }
            return sCarNum;
        }
        #endregion
 

 

 

 

 

 

你可能感兴趣的:(C#)