字符串转换16进制数组时报的错,求解

maoxiaoling9598 2011-03-15 01:56:09
我有这样段代码
private static byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
if (s.Length % 2 != 0)
{
s += " ";
}
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i++)
{
buffer[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
}
return buffer;
}
在转换的过程我跟踪调试,当跑到for循环里面时,报将字串符转换成datetime日期格式的错误,我这里没有这东西啊!怎么会报这样的错误呢?

...全文
733 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsccpublic 2011-07-03
  • 打赏
  • 举报
回复
Convert.ToByte这里找你的逻辑参数是诸如“6E”这种16进制形式的“字符串”,而非数值,这样的是没法转换的,或许你对数值类型的理解不够深入,Convert.ToByte所支持的字符串形式只有“00100100”这样的
walkghost 2011-03-15
  • 打赏
  • 举报
回复
PS:编码和解码网络数据或者串口数据时要用同样的编码格式,如果发送方使用ASCII编码你接收到以后也要把字节流用ASCII格式化成字符串。不然会出现乱码(主要出现在传送汉字等两字节或四字节字符时)。
walkghost 2011-03-15
  • 打赏
  • 举报
回复
楼主啊,如果你是想要把字符串转换成字节数组后通过网络或者串口发送的话,你试试这样:


byte [] buffer=System.Text.Encoding.UTF8.GetBytes("测试汉字English123.");


如果是把16进制数字的“0123456789ABCDEF”转换成16进制的0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D的话就用上上面贴出来的函数。
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lizhibin11 的回复:]
你方法用反了,参照楼上那两个方法,看看用哪个吧.
[/Quote]
是啊!好像是这样的吧!我倒。白忙活了
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
你方法用反了,参照楼上那两个方法,看看用哪个吧.
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lizhibin11 的回复:]
十六进制里没有s,只有数字和a-f
[/Quote]

我那个是字符串,我需要把他转成16进制字节,如果我直接按16进制格式来写的化,那就不需转换了。。。5555555
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 maoxiaoling9598 的回复:]
引用 14 楼 lizhibin11 的回复:
把你的字符串贴出来看看

hexString = "asdasdas";
我随便写的字符串
[/Quote]
我说的就是这个字符串,注意十六进制里没有s,只有0-9,a-f
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lizhibin11 的回复:]
把你测试时报错的字符串贴出来
[/Quote]
未处理 System.FormatException
Message="未找到任何可识别的数字。"
Source="mscorlib"
StackTrace:
在 System.ParseNumbers.StringToInt(String s, Int32 radix, Int32 flags, Int32* currPos)
在 System.Convert.ToByte(String value, Int32 fromBase)
在 ParkingManagementSys.DataAcquisition.CommPort.strToToHexByte(String hexString) 位置 E:\mxlworkspace\ParkingManagementSystem\ParkingManagementSys\ParkingManagementSys\DataAcquisition\CommPort.cs:行号 320
在 ParkingManagementSys.DataAcquisition.CommPort.WriteToSerialPort(String TypeString, String str) 位置 E:\mxlworkspace\ParkingManagementSystem\ParkingManagementSys\ParkingManagementSys\DataAcquisition\CommPort.cs:行号 348
在 ParkingManagementSys.ParamSet.button1_Click(Object sender, EventArgs e) 位置 E:\mxlworkspace\ParkingManagementSystem\ParkingManagementSys\ParkingManagementSys\ParamSet.cs:行号 39
在 System.Windows.Forms.Control.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
在 System.Windows.Forms.Button.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.Run(Form mainForm)
在 ParkingManagementSys.Program.Main() 位置 E:\mxlworkspace\ParkingManagementSystem\ParkingManagementSys\ParkingManagementSys\Program.cs:行号 18
在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
InnerException:
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
十六进制里没有s,只有数字和a-f
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lizhibin11 的回复:]
把你的字符串贴出来看看
[/Quote]
hexString = "asdasdas";
我随便写的字符串
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
把你测试时报错的字符串贴出来
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
我刚发现是如果转换数字的话就不会报错,但一换成字符串,就报错了。不会是只能转数字吧!我靠!
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
把你的字符串贴出来看看
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 walkghost 的回复:]
参考:


C# code

/// <summary>
/// 十六进制字符串转换字节数组(自动去掉空格)
/// </summary>
/// <param name="s">要转换的字符串</param>
/// <returns>转换后的字节数组</returns>
public st……
[/Quote]

我都试过了!还是不行!
for (int i = 0; i < buffer.Length; i += 2)
{
string s1 = s.Substring(i, 2);
buffer[i / 2] = Convert.ToByte(s1, 16); }
主要是红色这一句报错,我实在是搞不懂,这关datetime什么事啊!
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lizhibin11 的回复:]
那这个字符串可能不是一个规则的表示16进制的字符串.如果是规则的,不会存在字符个数为奇数的情况.你先这样处理,如果是奇数,补零,但这样结果肯定不是你要的.
if (s.Length % 2 != 0)
{
s += "0";
}
[/Quote]

代码在第一次进入循环的时候就报这样的错误了!
walkghost 2011-03-15
  • 打赏
  • 举报
回复
再来一个字节数组转换成十六进制字符串的:



/// <summary>
/// 字节数组转换成十六进制字符串(不带空格)
/// </summary>
/// <param name="data">要转换的字节数组</param>
/// <returns>转换后的字符串</returns>
public static string ByteArrayToHexStringNoBlank(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
return sb.ToString().ToUpper();
}
walkghost 2011-03-15
  • 打赏
  • 举报
回复
参考:


/// <summary>
/// 十六进制字符串转换字节数组(自动去掉空格)
/// </summary>
/// <param name="s">要转换的字符串</param>
/// <returns>转换后的字节数组</returns>
public static byte[] HexStringToByteArray(string s)
{
if (s.Length = 0)
throw new Exception("将16进制字符串转换成字节数组时出错,错误信息:被转换的字符串长度为0。");
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
#endregion

lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
那这个字符串可能不是一个规则的表示16进制的字符串.如果是规则的,不会存在字符个数为奇数的情况.你先这样处理,如果是奇数,补零,但这样结果肯定不是你要的.
if (s.Length % 2 != 0)
{
s += "0";
}
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lizhibin11 的回复:]
i < s.Length修改为buffer.Length
[/Quote]
我改了!可还是报错
maoxiaoling9598 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 maco_wang 的回复:]
错误信息贴出来看一下?
[/Quote]
加载更多回复(6)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧