字符串之间的转换(基于vs2008 C#)__后续给出C版本的

1. .NET编程 -- 字节数组、数值和十六进制字符串的转换

内容出自:http://www.cnblogs.com/MaxWoods/archive/2008/02/20/1074223.html

1   将字节数组转化为数值
publicstaticint ConvertBytesToInt(byte[] arrByte, int offset)
{
   
returnBitConverter.ToInt32(arrByte,offset);
}

2   将数值转化为字节数组
第二个参数设置是不是需要把得到的字节数组反转,因为Windows操作系统中整形的高低位是反转转之后保存的。
publicstaticbyte[] ConvertIntToBytes(int value, bool reverse)
{
   
byte[] ret = BitConverter.GetBytes(value);
   
if (reverse)
       
Array.Reverse(ret);
   
return ret;
}

3   将字节数组转化为16进制字符串
第二个参数的含义同上。
publicstaticstring ConvertBytesToHex(byte[] arrByte, bool reverse)
{
   
StringBuilder sb = newStringBuilder();
   
if (reverse)
       
Array.Reverse(arrByte);
   
foreach (byte b in arrByte)
        sb.AppendFormat(
"{0:x2}", b);
   
return sb.ToString();
}

4   将16进制字符串转化为字节数组
publicstaticbyte[] ConvertHexToBytes(string value)
{
   
int len = value.Length / 2;
   
byte[] ret = newbyte[len];
   
for (int i = 0; i < len;i++)
        ret[i]=(
byte)(Convert.ToInt32(value.Substring(i* 2, 2), 16));
   
return ret;
}

 

2. C# double float int string 与 byte数组 相互转化

在做通信编程的时候,数据发送多采用串行发送方法,实际处理的时候多是以字节为单位进行处理的。在C/C++多字节变量与Byte进行转化时候比较方便采用UNION即可
废话少说看示例:
typedef union

{
double data_df;
byte     data_b[8];
}DoubleYByte;
本示例实现了doublebyte的相互转化
typedef union

{
float data_f;
byte data_b;
}FloatYByte;
本示例实现了floatbyte的相互转化
其他的数据类型short int long等都可以采用上述示例转换C/C++中可以很容易的实现

但是在上位机编程中,采用C#编程就比较麻烦,因为没有union可用
但是C#提供一个类system.BitConverter来专门解决这种转换问题,该类如下显示
方法
DoubleToInt64Bits   
 将指定的双精度浮点数转换为 64 位有符号整数。
GetBytes   
 已重载。将指定的数据转换为字节数组。
Int64BitsToDouble   
 将指定的 64 位有符号整数转换成双精度浮点数。
ToBoolean   
 返回由字节数组中指定位置的一个字节转换来的布尔值。
ToChar   
 返回由字节数组中指定位置的两个字节转换来的 Unicode 字符。
ToDouble   
 返回由字节数组中指定位置的八个字节转换来的双精度浮点数。
ToInt16   
 返回由字节数组中指定位置的两个字节转换来的 16 位有符号整数。
ToInt32   
 返回由字节数组中指定位置的四个字节转换来的 32 位有符号整数。
ToInt64   
 返回由字节数组中指定位置的八个字节转换来的 64 位有符号整数。
ToSingle   
 返回由字节数组中指定位置的四个字节转换来的单精度浮点数。
ToString   
 已重载。将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
ToUInt16   
 返回由字节数组中指定位置的两个字节转换来的 16 位无符号整数。
ToUInt32   
 返回由字节数组中指定位置的四个字节转换来的 32 位无符号整数。
ToUInt64   
 返回由字节数组中指定位置的八个字节转换来的 64 位无符号整数。
若想把float类型转化为byte示例如下:
float a=1.23;

byte[] b=BitConverter.GetBytes(a);
若想把变量b重新转化为float类型可以使用toSingle方法,示例如下:
float c=BitConverter.ToSingle(b,0);//
应为ab中其实字节为0,故第二个参数为0

还有就是stringbyte[]的变换如果知道就很简单
     byte[] byteArray = System.Text.Encoding.Default.GetBytes(  str  );
     string str = System.Text.Encoding.Default.GetString( byteArray );
System.Text.Encoding class中,还有很多其它有用的方法,像GetChars,从一个byte[]转成一个char[],等等,还有其它编码方式的,如System.Text.UTF8Encoding classSystem.Text.UnicodeEncodingclass等,根据不同需要可选不同的class具体请参考MSDN


 

3. 数据加密标准(DES)的C#实现(3)--将BitConverter.ToString的结果转回byte[]

/*
 * 数据加密标准(DES)C#实现(3)
 * BitConverter.ToString的结果转回byte[]
 * 
 * 采用随机的密钥Key和初始化向量IV加密
 * 使用随机密码的好处:系统不会产生弱密钥
 * 备注:本例与《数据加密标准(DES)C#实现(2)》本质相同,只是采用BitConverter.ToString
 * 输出密文、密钥和初始化向量,而不是采用Base64编码格式
 * 
 * 
 * 夏春涛 Email:xChuntao@163.com 
 * Blog:http://bluesky521.cnblogs.com
 * 运行环境:.net2.0 framework
 */

/**//* 
 * 关于DES加密中的初始化向量IV
 * 对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为
 * 同一个密码文本输出块。如果您的纯文本流中有重复块,则您的密码文本流中也会
 * 有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以
 * 利用该信息来解密已知的密码文本块,并有可能重新获得您的密钥。为了防止这个
 * 问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的
 * 纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需
 * 要初始化向量来加密数据的第一个块。 
 */

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace DES_App3
{
    class Program
    {
        static void Main(string[] args)
        {
            string str_plain_text = "How are you?";
            Console.WriteLine("原文:" + str_plain_text);

            string KEY_64 = ""
            string IV_64 = "";  

            string str_cypher_text = DES_Encrypt(str_plain_text, out KEY_64, out IV_64);
            Console.WriteLine("密文:" + str_cypher_text);
            
            Console.WriteLine("解密:" + DES_Decrypt(str_cypher_text, KEY_64, IV_64));

            Console.WriteLine("本次密钥:" + KEY_64);
            Console.WriteLine("本次初始化向量:" + IV_64);
            Console.WriteLine();

            //-------------------------------

            str_cypher_text = DES_Encrypt(str_plain_text, out KEY_64, out IV_64, false);
            Console.WriteLine("密文:" + str_cypher_text);

            Console.WriteLine("解密:" + DES_Decrypt(str_cypher_text, KEY_64, IV_64));

            Console.WriteLine("本次密钥:" + KEY_64);
            Console.WriteLine("本次初始化向量:" + IV_64);
            Console.WriteLine();
            
        }

        //BitConverter.ToString字符串,"98-ED-0S-9A",还原转换为byte[]
        static public byte[] BitStr_ToBytes(string bit_str)
        {
            string[] arrSplit = bit_str.Split('-');
            byte[] byteTemp = new byte[arrSplit.Length];
            for (int i = 0; i < byteTemp.Length; i++)
            {
                byteTemp[i] = byte.Parse(arrSplit[i], System.Globalization.NumberStyles.AllowHexSpecifier);

            }

            return byteTemp;
        }


        //BitConverter.ToString字符串(不含'-'),"98ED0S9A",还原转换为byte[]
        static public byte[] BitStr_ToBytes2(string bit_str)
        {
            int n = bit_str.Length / 2 - 1;
            for (int i = n; i > 0; i--)
            {
                bit_str = bit_str.Insert(i * 2, "-");
            }

            return BitStr_ToBytes(bit_str);
        }

  //----
        DES加密/解密#region DES加密/解密
        /**//// <summary>
        /// DES加密
        /// </summary>
        /// <param name="str_plain_text">明文</param>
        /// <param name="str_des_key">密钥,8个字符(64bit</param>
        /// <param name="str_des_iv">初始向量,8个字符(64bit</param>
        /// <param name="hasSubSign">输出密文、str_des_keystr_des_iv时,是否保留BitConvert.ToString中的减号</param>
        /// <returns>密文</returns>
        static public string DES_Encrypt(string str_plain_text, out string str_des_key, out string str_des_iv, bool hasSubSign)
        {
            string str_cypher_text = "";

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream();
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cst);
            sw.Write(str_plain_text);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();
            //-----
            str_cypher_text = BitConverter.ToString(ms.GetBuffer(),0,(int)ms.Length);//**
            str_des_key = BitConverter.ToString(cryptoProvider.Key);//**
            str_des_iv = BitConverter.ToString(cryptoProvider.IV);  //**

            if (!hasSubSign)
            {
                str_cypher_text = str_cypher_text.Replace("-""");
                str_des_key = str_des_key.Replace("-","");
                str_des_iv = str_des_iv.Replace("-","");
            }

            return str_cypher_text;
        }

        static public string DES_Encrypt(string str_plain_text, out string str_des_key, out string str_des_iv)
        {
            return DES_Encrypt(str_plain_text, out str_des_key, out str_des_iv, true);
        }

        /**//// <summary>
        /// DES解密
        /// </summary>
        /// <param name="str_cypher_text">密文</param>
        /// <param name="str_des_key">密钥,8个字符(64bit</param>
        /// <param name="str_des_iv">初始向量,8个字符(64bit</param>
        /// <returns>明文</returns>
        static public string DES_Decrypt(string str_cypher_text, string str_des_key, string str_des_iv)
        {
            byte[] byKey;
            byte[] byIV;
            byte[] byEnc;
            try
            {
                if (str_cypher_text.IndexOf('-') > 0 && str_des_key.IndexOf('-') > 0 && str_des_iv.IndexOf('-') > 0)//"-"
                {
                    byKey = BitStr_ToBytes(str_des_key);
                    byIV = BitStr_ToBytes(str_des_iv);
                    byEnc = BitStr_ToBytes(str_cypher_text);
                }
                else//"-"
                {
                    byKey = BitStr_ToBytes2(str_des_key);
                    byIV = BitStr_ToBytes2(str_des_iv);
                    byEnc = BitStr_ToBytes2(str_cypher_text);
                }
            }
            catch
            {
                return null;
            }

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream(byEnc);
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cst);
            string str_plain_text = sr.ReadToEnd();


            return str_plain_text;
        }
        #endregion
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值