现在做一个使用SOCKET组件,发送BCD码和接受BCD码的程序,具体怎样发送和接受BCD码,要先把一组BCD码放到数组中,然后具体怎样做呢?
解决方案 »
- 请问下Printer.Canvas.TextHeight(edt.text);
- bde发布
- 在线等待....各位兄弟帮帮忙
- 有关DBLookupCombo的问题,请指教!
- 求助Delphi7 TTable的DatabaseName属性中怎么没有自己定义的那个数据库名字?求高手解答
- 有没有关于DELPHI的技术书籍下载,但是我想打印出来的。所以最好是htm文件格式的.谢谢.
- 还是关于quickreport的问题!
- 怎么给dbGrid的columns赋值
- 我在学习 OOP 的地方遇到了障碍!
- 注册码问题,如何用已知的用户名字使用反运算得到数字?
- 如何用delphi结束任务管理器中的不响应的任务
- [****** 请教:可否将 ASP 解析程序嵌入我的应用程序里面了? ******]
压缩bcd在转换后,在字符拼接一下,
function ToBCD(x:integer):string;
var
sBCD:string; //压缩BCD
begin
Result := '';
if x<0 then
exit; Result := IntToStr(x); //转换成非压缩BCD码
sBCD := '';
for i := 1 to (Length(Result) div 2) do
sBCD := sBCD + Chr((StrToInt(Result[i*2-1]) shl 4)+StrToInt(Result[i*2])); Result := sBCD;
end;
var
sBCD:string;
begin
Result := -1;
if x='' then
exit; sBCD := '';
for i := 1 to Length(x) do
try
sBCD := sBCD + Chr((StrToInt(x[i]) and $F0) shl 4) and Chr(StrToInt(x[i]) and $0F)
except
exit;
end; Result := StrToInt(sBCD);
end;
var
sBCD:string; //压缩BCD
begin
Result := '';
if x<0 then
exit;
if x=0 then
begin
Result := #$FF;
exit;
end; Result := IntToStr(x); //转换成非压缩BCD码
if Length(Result) mod 2=1 then
Result := '0'+Result; sBCD := '';
for i := 1 to (Length(Result) div 2) do
sBCD := sBCD + Chr((StrToInt(Result[i*2-1]) shl 4)+StrToInt(Result[i*2])); Result := sBCD;
end;function FromBCD(x:string):integer;
var
sBCD:string;
begin
Result := -1;
if x='' then
exit;
if x=#$FF then
begin
x := 0;
exit;
end; sBCD := '';
for i := 1 to Length(x) do
try
sBCD := sBCD + Chr((StrToInt(x[i]) and $F0) shl 4) and Chr(StrToInt(x[i]) and $0F)
except
exit;
end; Result := StrToInt(sBCD);
end;
clientsocket1.socket.SendBuf(cf1^,count);读取:
count:=socket.ReceiveLength;
getmem(cf1,count);
socket.ReceiveBuf(cf1^,count);
我运行到socket.ReceiveBuf(cf1^,count);报错。
一般我把两端的类型都设为ctNonBlocking,
然后两边都定义一个一样的结构,当然这个结构的大小肯定是预知的,SizeOf出来的肯定是个固定值,
然后在Client端的OnConnect里发数据:Socket.SendBuf(recData,SizeOf(recData));
然后在Server端的OnClientConnect里收数据,Socket.ReceiveBuf(recData,SizeOf(recData));
Server端就在OnClientConnect里处理完数据,Socket.SendBuf(recData,SizeOf(recData));
如果在外面处理的话要把SocketId记录下来,到时候到ServerSocket.Socket.Connections[i].SendBuf(recData,SizeOf(recData)),在connections数组里根据SocketId去找相应的连接;
然后再Client端的OnRead里,读取返回:Socket.ReceiveBuf(recData,SizeOf(recData));
我觉得你和我情况不太一样,首先你传递的是长度不固定的字符串,所以建议你用SendText方法和ReceiveText方法;
整个通信流程估计还是差不多的吧,应该可以借鉴;明天如果我有时间会试一下你这个功能,我晚上不在网上,msn加你了,我上班时间都在祝你好运
count:=socket.ReceiveLength;
getmem(cf1,count);
socket.ReceiveBuf(cf1^,count);
我运行到socket.ReceiveBuf(cf1^,count);报错
程序应该怎样更改呢?