C#中string与byte[]的转换帮助类

C#字符串与字节数组转换
本文介绍了一个实用的C#帮助类StrHelper,该类简化了字符串(string)与字节数组(byte[])之间的转换过程,并提供了Hex与Hexbin之间的转换方法。特别适合于处理涉及DES/TripleDES加密算法的老代码移植工作。
在写C#程序时,string和byte[]之间的转换比较烦,在移植一些老程序时感觉很不好。我在C#中使用DES和TripleDES时移植一块老代码时也遇到了同样的情况。为了下次不为同样的事情烦恼,就写了下面的帮助类。
主要实现了以下的函数


代码中出现的Sidle是我的网名。

/*
* @Author WuErPing
* @Version 1.0
* @Date 2004/11/30
* @Description:
*/
using System;
using System.Text;
namespace SidleHelper
{
/// <summary>
/// Summary description for StrHelper.
/// 命名缩写:
/// Str: unicode string
/// Arr: unicode array
/// Hex: 二进制数据
/// Hexbin: 二进制数据用ASCII字符表示 例 字符'1'的hex是0x31表示为hexbin是 '3''1'
/// Asc: ASCII
/// Uni: UNICODE
/// </summary>
public sealed class StrHelper
{
#region Hex与Hexbin的转换
public static void Hexbin2Hex(byte[] bHexbin, byte[] bHex, int nLen)
{
for(int i=0; i<nLen/2; i++)
{
if(bHexbin[2*i] <0x41)
{
bHex[i] = Convert.ToByte(((bHexbin[2*i] - 0x30)<<4) & 0xf0);
}
else
{
bHex[i] = Convert.ToByte(((bHexbin[2*i] - 0x37)<<4) & 0xf0);
}

if(bHexbin[2*i+1] <0x41)
{
bHex[i] |= Convert.ToByte((bHexbin[2*i+1] - 0x30) & 0x0f);
}
else
{
bHex[i] |= Convert.ToByte((bHexbin[2*i+1] - 0x37) & 0x0f);
}
}
}
public static byte[] Hexbin2Hex(byte[] bHexbin, int nLen)
{
if(nLen%2 !=0)
return null;
byte[] bHex = new byte[nLen/2];
Hexbin2Hex(bHexbin, bHex, nLen);
return bHex;
}
public static void Hex2Hexbin(byte[] bHex, byte[] bHexbin, int nLen)
{
byte c;
for(int i=0;i<nLen;i++)
{
c = Convert.ToByte((bHex[i]>>4) & 0x0f);
if(c < 0x0a)
{
bHexbin[2*i] = Convert.ToByte(c + 0x30);
}
else
{
bHexbin[2*i] = Convert.ToByte(c + 0x37);
}
c = Convert.ToByte(bHex[i]&0x0f);
if(c < 0x0a)
{
bHexbin[2*i+1] = Convert.ToByte(c + 0x30);
}
else
{
bHexbin[2*i+1] = Convert.ToByte(c + 0x37);
}
}
}
public static byte[] Hex2Hexbin(byte[] bHex, int nLen)
{
byte[] bHexbin = new byte[nLen*2];
Hex2Hexbin(bHex, bHexbin, nLen);
return bHexbin;
}
#endregion

#region 数组和字符串之间的转化
public static byte[] Str2Arr(String s)
{
return (new UnicodeEncoding()).GetBytes(s);
}
public static string Arr2Str(byte[] buffer)
{
return (new UnicodeEncoding()).GetString(buffer, 0, buffer.Length);
}

public static byte[] Str2AscArr(String s)
{
return System.Text.UnicodeEncoding.Convert(System.Text.Encoding.Unicode,
System.Text.Encoding.ASCII,
Str2Arr(s));
}

public static byte[] Str2HexAscArr(String s)
{
byte[] hex = Str2AscArr(s);
byte[] hexbin = Hex2Hexbin(hex, hex.Length);
return hexbin;
}
public static string AscArr2Str(byte[] b)
{
return System.Text.UnicodeEncoding.Unicode.GetString(
System.Text.ASCIIEncoding.Convert(System.Text.Encoding.ASCII,
System.Text.Encoding.Unicode,
b)
);
}

public static string HexAscArr2Str(byte[] buffer)
{
byte[] b = Hex2Hexbin(buffer, buffer.Length);
return AscArr2Str(b);
}
#endregion
}

 
<think>好的,我现在需要回答用户关于如何在C#中将byte数组转换为字符串的问题。首先,我要回忆一下用户提供的引用内容,看看有没有直接相关的信息。 根据引用[1],用户提到了使用Array.ConvertAll方法将字符串数组转换byte数组,但这里的问题相反,是要将byte数组转成字符串。不过,引用[3]中提到了一些转换方法,特别是将byte数组转换为字符串的方法。比如,方法1可能涉及使用Convert.ToByte和十六进制处理,但具体如何反过来呢? 用户提供的引用[3]中有提到将十六进制字符串转为byte数组,但反过来可能需要将每个byte转换为十六进制字符串。比如,每个byte用两个字符表示,然后拼接起来。例如,byte值255转换为"FF",然后整个数组拼接成一个字符串。这可能是一种方法。 另外,引用[3]中的方法1可能指的是将byte数组转换为字符串的另一种方式,比如使用Encoding。比如,使用UTF8、ASCII等编码方式将byte数组解码为字符串。这在C#中很常见,比如Encoding.UTF8.GetString(byteArray)。 所以,可能的转换方法有两种:一种是基于编码的转换,比如使用Encoding;另一种是将每个byte转为十六进制字符串,然后拼接起来。用户的问题可能指的是这两种情况,但需要明确他们的具体需求。 用户的问题可能更倾向于将byte数组转换为字符串的原始数据表示,比如将每个byte的值转为字符串形式,用逗号分隔,如引用[1]中的例子。或者,他们可能需要将byte数组视为某种编码的字节流,转换为对应的字符串,比如UTF8字符串。 因此,我需要分情况说明。首先,如果用户想将byte数组转换为表示字节值的字符串(例如,"72,101,108,108,111"),可以使用似引用[1]中的方法,但反过来操作。例如,使用string.Join和Select将每个byte转为字符串,并用逗号连接。例如: string result = string.Join(",", byteArray.Select(b => b.ToString())); 另一种情况是将byte数组转换为十六进制字符串,如引用[3]中的例子,但反过来。例如,每个byte转换为两位十六进制字符,然后连接起来。例如: string hex = BitConverter.ToString(byteArray).Replace("-", ""); 或者手动遍历每个byte,使用ToString("X2")格式。 第三种情况是使用编码转换,比如将byte数组视为使用某种编码的字节流,转换为对应的字符串。例如: string str = Encoding.UTF8.GetString(byteArray); 需要根据用户的具体需求选择合适的方法。用户提供的引用中提到了两种方式:一种是转换字节值为字符串数组再合并,另一种是十六进制转换。此外,编码转换也是一种常见方法,可能在引用中没有明确提到,但属于C#的标准做法。 因此,回答需要涵盖这三种情况,并引用用户提供的参考资料中的相关部分。比如,如果用户想将每个byte的值转为字符串并用逗号分隔,可以参照引用[1]中的方法,但反过来操作。如果是十六进制转换,参考引用[2]和[3]中的方法。编码转换则可能不在提供的引用中,但属于标准方法,可以补充说明。 需要确保回答结构清晰,分点说明不同方法,并给出代码示例。同时,生成相关问题,比如不同方法的区别、如何处理编码问题等。</think>在C#中将byte数组转换为字符串的常用方法有以下三种,根据具体需求选择: ### 1. 数值型字符串转换(保留字节值) 将每个byte元素转换为字符串并用分隔符连接: ```csharp byte[] byteArray = {72, 101, 108, 108, 111}; string result = string.Join(",", byteArray.Select(b => b.ToString())); // 输出 "72,101,108,108,111" ``` 此方法常用于保存原始字节数据[^1]。 ### 2. 十六进制字符串转换 使用内置方法`BitConverter`或手动转换: ```csharp // 使用BitConverter string hex1 = BitConverter.ToString(byteArray).Replace("-", ""); // 手动转换 string hex2 = string.Concat(byteArray.Select(b => b.ToString("X2"))); // 示例结果:"48656C6C6F"(对应"Hello"的UTF8字节) ``` 此方法符合引用[2][^2]和引用[3][^3]中提到的十六进制处理逻辑。 ### 3. 编码解码转换 使用字符编码还原文本内容: ```csharp byte[] utf8Bytes = {72, 101, 108, 108, 111}; string text = Encoding.UTF8.GetString(utf8Bytes); // 输出 "Hello" ``` 需注意选择编码时一致的字符集(如UTF8、ASCII)。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值