广告
淘宝内部优惠券
当前位置: 开发异常方案库» Delphi » idTcpServer 如何发送16进制数的问题,百度找了一堆,都测试不通。

idTcpServer 如何发送16进制数的问题,百度找了一堆,都测试不通。

开发异常方案库  收集整理于:2020-04-20 11:56:00  浏览:66次
DELPHI 10.2  idTcpServer  控件 我现在需要和单片机建立对接,对方只能接受16进制数据,我现在已经将要发送的数据转成了16进制的格式,如: C7 44 C7 44 86 34 66  ,然后该如何发给对方? 我现在用:  try   i:=combobox1.Items.IndexOf(combobox1.Text);   ConnContext := TIdContext(idtcpserver1.Contexts.LockList.Items[I]);   conncontext.Connection.IOHandler.writeln(memo1.Text);   finally     IdTCPServer1.Contexts.UnlockList;  end; 单片机能收到我的数据,但对方收到的是一个字符串,他会再把这个数据转成16进制,所以返回不了我要想要的结果。 请问各们大神如何处理?

------网友观点--------------------
你发送的是字符串,你要把16进制对应的字符串写入也是可以。 或者 writeln 改成 write,直接写入 TBytes exam: var   buf: TBytes; begin   SetLength(buf,7);   buf[0] := $C7;   buf[1] := $44;   buf[2] := $C7;   ...   conncontext.Connection.IOHandler.write(buf); end;

------网友观点--------------------
引用 1 楼 天行归来 的回复:
你发送的是字符串,你要把16进制对应的字符串写入也是可以。 或者 writeln 改成 write,直接写入 TBytes exam: var   buf: TBytes; begin   SetLength(buf,7);   buf[0] := $C7;   buf[1] := $44;   buf[2] := $C7;   ...   conncontext.Connection.IOHandler.write(buf); end;
这个是正解。

------网友观点--------------------
引用 1 楼 天行归来 的回复:
你发送的是字符串,你要把16进制对应的字符串写入也是可以。 或者 writeln 改成 write,直接写入 TBytes exam: var   buf: TBytes; begin   SetLength(buf,7);   buf[0] := $C7;   buf[1] := $44;   buf[2] := $C7;   ...   conncontext.Connection.IOHandler.write(buf); end;
感谢支持!!! 我现在是从一个文件里面取出来的这些16进制,数据巨大,
引用 1 楼 天行归来 的回复:
你发送的是字符串,你要把16进制对应的字符串写入也是可以。 或者 writeln 改成 write,直接写入 TBytes exam: var   buf: TBytes; begin   SetLength(buf,7);   buf[0] := $C7;   buf[1] := $44;   buf[2] := $C7;   ...   conncontext.Connection.IOHandler.write(buf); end;
引用 1 楼 天行归来 的回复:
你发送的是字符串,你要把16进制对应的字符串写入也是可以。 或者 writeln 改成 write,直接写入 TBytes exam: var   buf: TBytes; begin   SetLength(buf,7);   buf[0] := $C7;   buf[1] := $44;   buf[2] := $C7;   ...   conncontext.Connection.IOHandler.write(buf); end;
18年的大神呀,幸会,感谢支持。 我这里还是被卡住了,实际上我被绕进去了。 我这里是通过idTcpServer 要发送一个图片到客户端去(客户端有一个显示屏,接收正常就会显示我发送的图片),客户端只能接受十六进制,我便想到先把图片转成16进制后再写,现在想是越搞越复杂。 能不能给一段代码?我通过网上找的资料,整理了下面一段,发送有点慢,屏上面会出行一行彩色,没有出现我要的图片。 procedure TForm1.Button3Click(Sender: TObject); var   Mem: TMemoryStream;   bmp:tBitmap;   buf: array of byte;   i,j,bsize:integer;   connContext:Tidcontext; begin   Mem := TMemoryStream.Create;   bmp:=Tbitmap.Create;   bmp.LoadFromFile('d:\soft\abc.bmp');   bmp.SaveToStream(mem);   bSize:=mem.Size;   setLength(buf,bSize);   Mem.Position := 0;   Mem.Readbuffer(buf[0],bSize);   i:=combobox1.Items.IndexOf(combobox1.Text);   ConnContext := TIdContext(idtcpserver1.Contexts.LockList.Items[I]);   for j := 0 to Bsize do    connContext.Connection.IOHandler.Write(buf[j]) end;

------网友观点--------------------
Write 方法可以一次性写入,不需要一次一个字节,用 Write(buf) 试下。 另外,我看了还有 WriteFile 这个方法,也可以试下。

------网友观点--------------------
既然是16进制数据,那发送的应该是字符串'C744C744863466'

------网友观点--------------------
图片本来就是 16 进制的数据。说白了,计算机里面的数据都是 16 进制的。也都是2进制的。就是一个一个的 Byte 字节。 至于 Indy,它可以发送 TBytes。因此,你的问题是,如何把图片文件,转换为 TBytes。我忘记了 Indy 是否可以直接发送 TStream,如果可以,你的图片文件,直接用 TFileStream 加载然后直接发送就可以了。 如果 Indy 不能发送 TStream,那么,你要做的是,搞一个 TBytes,把文件内容都搬进去。方法就是搞一个 TFileStream 来加载文件,然后设置 TBytes 的大小和 TFileStream 的大小一样,然后 TFileStream.ReadBuffer 就可以把它的内容搬进 TBytes。 Indy 好像是用 TIdBytes,一样的。 另外,向单片机写数据,要照顾它的速度,小心电脑这边太快,单片机忙不过来出问题。
发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
软件开发 程序错误 异常 ybaby.netCopyright © 2020-2026  ybaby 版权所有  桂ICP备17004385号-2 网站地图