VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1016|回复: 8

socket发送record类型变量,怎么会这样??

[复制链接]

2

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-23 20:00:02 | 显示全部楼层 |阅读模式
//1.结构定义
    TMsgHead=packed record                 
      iMsgLen:Longint;
      iMsgID:Longint;
      sMsgSerial:Array[0..11] of char;
    end;

    TMsgBody_Bind=packed record        
      iLoginType:Byte;
      sLoginUser:Array[0..15] of char;
      sLoginPwd:Array[0..15] of char;
      sReserve:Array[0..7] of char;
    end;

    TMsg_Bind=packed record
      MsgHead:TMsgHead;
      MsgBody:TMsgBody_Bind;
    end;

//2.赋值-----------------------------------------------
function TLT.BindData_Create():TMsg_Bind;
var
  BindData:TMsg_Bind;
begin
  ZeroMemory(@BindData,Sizeof(BindData));
  BindData.MsgBody.iLoginType:=$1;   
  .....赋值操作


//调用,发送-----------------------------------------------
procedure TForm1.SckLtConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  BindData:TMsg_Bind;
begin
  BindData:=Lt.BindData_Create;
  sckLt.Socket.SendBuf(BindData,sizeof(BindData));
......................
  result:=BindData;

//-------------------------------------------------
现在的问题是,结构里面的iloginType等类型,赋数值之后,使用socket发送结构,发现数字1是用01 00 00 00 表示的,而不是00 00 00 01表示的,请问怎么会这样,服务器那边要求必须是00 00 00 01,这该怎么办呀??

盼高手指教!
回复

使用道具 举报

0

主题

40

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-4 13:45:02 | 显示全部楼层
不懂帮顶一下

数字1是用01 00 00 00 表示的
, 而不是00 00 00 01表示的,这样表示的话它就不是1了。

严重关注
回复

使用道具 举报

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-4 16:45:02 | 显示全部楼层
去掉packed 关键字试试
回复

使用道具 举报

2

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
 楼主| 发表于 2020-7-7 14:15:01 | 显示全部楼层
去掉packed不行,刚才试了

要是实在不行,只好放弃使用结构,直接申请61字节的缓冲区了。然后自己转换顺序.

不过还是期待高手发表意见,下午下班结贴。
回复

使用道具 举报

0

主题

40

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-7 17:00:01 | 显示全部楼层
很有难度了,在DELPHI中整数就是这样表示的,高位在后面。如果自己手动移位,它表示的数值也就变了,如果你所需要的整数很少,比如在0-9之间,你可以用字符表示,这样就好处理了。
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-8 19:00:01 | 显示全部楼层
你可以在接收端也定义同样的RECORD类型 接收时直接RECV到RECORD里面 应该就没问题了
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-9 08:30:01 | 显示全部楼层
Intel的CPU中多字节整数是低位在前,高位在后的。
Motorola的CPU中多字节整数是高位在前,低位在后的。
从楼主的描述来看,服务器端的程序是别人已经写好了的。如果真是这样的话,只能自己写转换函数来转换顺序了。
回复

使用道具 举报

0

主题

40

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-9 13:15:02 | 显示全部楼层
楼主是C++写好的服务端
回复

使用道具 举报

2

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
 楼主| 发表于 2020-7-15 20:15:01 | 显示全部楼层
把原来的record全废了,重新使用Array[..] of Byte,痛苦.....
然后自己写处理函数,转换字节.....

不过还是搞定了..谢谢大家!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表