如:ABC123abc <==> 414243313233616263 //“A”的十六进制ascii码为“41”,依此类推以下代码太慢了:
/// <summary>
/// 字符串 转为 16进制格式
/// </summary>
public static string StrToHexStr(string s)
{
string s2 = "";
for (int i = 0; i < s.Length; i++)
{
string sTmp = Convert.ToString(s[i], 16);
if (sTmp.Length == 1)
{
sTmp = "0" + sTmp;
}
s2 += sTmp;
}
return s2;
}/// <summary>
/// 16进制格式 转回 字符串
/// </summary>
public static string HexStrToStr(string s)
{
string s2 = "";
for (int i = 0; i < s.Length; i += 2)
{
string ss = s[i].ToString() + s[i + 1].ToString();
int n = Convert.ToInt32(ss, 16);
s2 += (char)n;
}
return s2;
}
/// <summary>
/// 字符串 转为 16进制格式
/// </summary>
public static string StrToHexStr(string s)
{
string s2 = "";
for (int i = 0; i < s.Length; i++)
{
string sTmp = Convert.ToString(s[i], 16);
if (sTmp.Length == 1)
{
sTmp = "0" + sTmp;
}
s2 += sTmp;
}
return s2;
}/// <summary>
/// 16进制格式 转回 字符串
/// </summary>
public static string HexStrToStr(string s)
{
string s2 = "";
for (int i = 0; i < s.Length; i += 2)
{
string ss = s[i].ToString() + s[i + 1].ToString();
int n = Convert.ToInt32(ss, 16);
s2 += (char)n;
}
return s2;
}
解决方案 »
- 【难】关于URL编码问题
- C# 使用DirectShow.NET采集USB视频数据 问题
- 英语翻译view student wise and date wise attendance
- 为什么使用OpenFileDialog控件后应用程序的路径发生了问题
- asp.net C# datagrid checkbox选择好按下按钮后如何清空checkbox?
- 如何用C#来实现自已的文件数据库
- 在自己的程序中如何获取系统传递来的多个文件的文件名?
- 散分贴,请CSTerry(Terry)和其他在CSDN上回答过问题的朋友进, 祝大家愉快
- C#
- 请教:用空格或Tab分割字符串,但忽略双引号内的内容
- 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- js点击按钮后,按钮背景颜色变成红色,再点击变成白色
本可以用Base64编码,但可能会出现 不同开发环境不同编码表 会出现不同结果,
为了能让delphi7与C#的编码能统一,所以用16进制格式。delphi7的很快,有自带的 BinToHex函数:
//字符串转换成16进制字符串
function StrToHexStr(s:string):string;
begin
SetLength(Result, length(s)*2);
BinToHex(@s[1], PAnsiChar(Result), length(s));
end;//16进制字符串转换成字符串
function HexStrToStr(s:string):string;
var
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
ms.SetSize(Length(s)div 2);
HexToBin(pchar(s), ms.Memory, ms.Size);
s:=MemoryStreamToStr(ms);
result:=s;
end;
string t = "";
foreach (char c in s) t += ((Int16)c).ToString("X2");
Console.WriteLine(t);
/// <summary>
/// 字符串 转为 16进制格式
/// </summary>
public static string StrToHexStr(string s)
{
StringBuilder sb = new StringBuilder();
foreach (char c in s)
{
//err sb.AppendFormat("{0:D2}", c);
//err sb.AppendFormat("{0:X2}", c); //如果这行可行的话,还能快一点
string sTmp = ((Int16)c).ToString("X2");
if (sTmp.Length == 1) sTmp = "0" + sTmp;
sb.Append(sTmp);
}
return sb.ToString();
}
static string GetHexString(string src)
{
return String.Join("", src.Select(ch => ((int)ch).ToString("X2")));
}
delphi7做成的dll参数必需是与 WindowsAPI 接轨的PChar类型,即以 "0x0" 结尾的字符串。
一个bin格式的dat文件的字节可能是 0x00~0xFF 之间任意值,包含了 0x00,PChar遇到0x0就结束了。
不得已才用 Base64编码 或 HexStr编码。
HexStr的长度是原字符串的两倍,base64的结果虽然精简,但选用不同的编码表可能会得到不同的结果,为了保险起见还是用HexStr。如果大家有更好的方法 让C#调用动态连接库的函数 不需要转换参数 那更好。
@youzelin, (同上)。编码是一个字节对应两个字符,解码的是两个字符对应一个字节,相对来讲复杂一些。