delphi中怎样把string转为array of byte?

_菜菜 2013-06-06 05:07:33
如,我的string为CA 01 A0 A1,我要把其转换为byte数组然后用串口发出,如何能让设备收到的也是CA 01 A0 A1,而不是一串数字?
...全文
992 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dang 2013-10-10
  • 打赏
  • 举报
回复
简单点就是
引用 24 楼 xhz8000 的回复:
function TForm1.HexStrToByte(HesStr: String): Byte; var iLen: Integer; begin Result := 0; iLen := length(HesStr); if iLen <> 2 then Exit; If not (HesStr[1] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit; If not (HesStr[2] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit; Result := StrToInt('$' + HesStr); end; 上面这个函数更简洁一些!
感谢楼主。 简而言之: Byte_Type_Var:=StrToInt('$' +String_Type_Var); //Length(String_Type_Var)<=2;
xhz8000 2013-06-07
  • 打赏
  • 举报
回复
function TForm1.HexStrToByte(HesStr: String): Byte; var iLen: Integer; begin Result := 0; iLen := length(HesStr); if iLen <> 2 then Exit; If not (HesStr[1] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit; If not (HesStr[2] in ['0'..'9', 'A'..'F', 'a'..'f']) Then Exit; Result := StrToInt('$' + HesStr); end; 上面这个函数更简洁一些!
xhz8000 2013-06-07
  • 打赏
  • 举报
回复
function TForm1.HexStrToByte(HesStr: String): Byte; var iLen: Integer; begin Result := 0; iLen := length(HesStr); if iLen <> 2 then Exit; If not (HesStr[1] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f']) Then Exit; If not (HesStr[2] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f']) Then Exit; Result := StrToInt('$' + HesStr); end; procedure TForm1.Button1Click(Sender: TObject); const SHEX = 'CA01A0A1'; var iByte: Byte; sTemp: String; hexBuf: array[0..1023] of byte; iStart, iCount, idex: Integer; begin idex := 0; iStart := 1; fillchar(hexBuf, sizeOf(hexBuf), #0); iCount := length(SHEX) + 1; while iStart < iCount do begin sTemp := SHEX[iStart]; iStart := iStart + 1; if iStart >= iCount then Break; sTemp := sTemp + SHEX[iStart]; iByte := HexStrToByte(sTemp); ShowMessage(IntToHex(iByte, 2)); hexBuf[idex] := iByte; idex := idex + 1; iStart := iStart + 1; end; end; 就是上面的代码了! 你测试一下看看是不是你要的!
看那山瞧那水 2013-06-07
  • 打赏
  • 举报
回复
你的string中的字符是表示的16进制的数?那你可以直接StrToInt() 从源字符串中取出2个字符构成一个临时字符串 比如: s2:='CA'; s2:='$'+s2; aByte:=inttostr(s2); 哈哈,要说清楚啊
_菜菜 2013-06-07
  • 打赏
  • 举报
回复
引用 18 楼 ZyxIp 的回复:
你没有说明 你的String 是 CA 01 A0 A1 这是个字符串,不算前后空格共有11个字符,占用11个字节。 对方我想应该收的是4个字节吧,每个字节用16进制表示是CA 01 A0 A1. 至于是16进制显示,还是10进制显示,这是串口精灵软件的表示给你看方式,在内存中都是0和1。 如果你愿意你还可以用8进制来看。
我就是想要,如果我的STRING中是CA,那就给我转到BYTE后也是CA,或都数字202,可是我CA转过去后,变成ASCII码表上标的数字了
xhz8000 2013-06-07
  • 打赏
  • 举报
回复
楼主就是把你的字符串每两位组成一个byte发送??
_菜菜 2013-06-07
  • 打赏
  • 举报
回复
引用 18 楼 ZyxIp 的回复:
你没有说明 你的String 是 CA 01 A0 A1 这是个字符串,不算前后空格共有11个字符,占用11个字节。 对方我想应该收的是4个字节吧,每个字节用16进制表示是CA 01 A0 A1. 至于是16进制显示,还是10进制显示,这是串口精灵软件的表示给你看方式,在内存中都是0和1。 如果你愿意你还可以用8进制来看。
别扯 0 1这些没用的,照你这么说电影文件还是0 1 组成的呢我就问,我就是想问怎么把string中表示十六进制的东西原封不动的转成byte
ZyxIp 2013-06-06
  • 打赏
  • 举报
回复
你没有说明 你的String 是 CA 01 A0 A1 这是个字符串,不算前后空格共有11个字符,占用11个字节。 对方我想应该收的是4个字节吧,每个字节用16进制表示是CA 01 A0 A1. 至于是16进制显示,还是10进制显示,这是串口精灵软件的表示给你看方式,在内存中都是0和1。 如果你愿意你还可以用8进制来看。
_菜菜 2013-06-06
  • 打赏
  • 举报
回复
- -那为什么我用VC写的程序发送的时候,用串口精灵抓到的数据就是十六进制的,而不是十进制数字
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
接收端把数字变回字符, Chr(48) - '0' Chr(65) - 'A' Chr(97) - 'a'
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
串口当然只能传数字啊 ASCII就是数字,你找个ASCII码表看看 ‘0’-48, …… ‘9’-57, .... 'A' - 65, 'a' - 97
_菜菜 2013-06-06
  • 打赏
  • 举报
回复
引用 12 楼 jankercsdn 的回复:
bs:=setlenght(bs,lenght(s));这个要改成bs:=setlength(bs,lenght(s)); 哈哈....这个语法都能不过啊
过了,是我自己多加了个填充零的语句 不过我用串口精灵看了一下,我发出的数据还都为数字,是十进制的数字 有没有办法就把我的string原样不动的转为array of byte
xhz8000 2013-06-06
  • 打赏
  • 举报
回复
var bs:array[0..1023] of byte; begin fillchar(bs, sizeof(bs), #0); //这里假设你的S长度不大于1K move(PChar(s)^, bs, length(s)); //下面就是你的发送代码了 .... end;
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
bs:=setlenght(bs,lenght(s));这个要改成bs:=setlength(bs,lenght(s)); 哈哈....这个语法都能不过啊
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
什么错?bs没分配吧
_菜菜 2013-06-06
  • 打赏
  • 举报
回复
引用 9 楼 jankercsdn 的回复:
这个报错? bs[0]:=Ord('A'); 这个报错吗?
是的
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
这个报错? bs[0]:=Ord('A'); 这个报错吗?
_菜菜 2013-06-06
  • 打赏
  • 举报
回复
引用 7 楼 jankercsdn 的回复:
有些串口通信协议是用ASCII传输的,比如Modbus就有RTU(二进制方式)和ASCII方式
bs[i-1]:=Ord(s[i]); 这里报错
看那山瞧那水 2013-06-06
  • 打赏
  • 举报
回复
有些串口通信协议是用ASCII传输的,比如Modbus就有RTU(二进制方式)和ASCII方式
_菜菜 2013-06-06
  • 打赏
  • 举报
回复
引用 4 楼 jankercsdn 的回复:
var bs:array of byte; bs:=setlenght(bs,lenght(s)); for i:=1 to lenght(s) do bs[i-1]:=Ord(s[i]); ...接收方用Chr(bs[j]) ASCII码,没概念?
没弄过这方面的东西,以前都是写数据库和网络
加载更多回复(5)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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