Qt socekt接收数据转换成结构体解析问题!!

Mind_Kid 2019-05-17 05:16:30
接收数据,然后转换成结构体,打印出来,结构体里面是一个字符就可以,里面有字符数组的只有第一个name打印出来了,后面打number这些都是空,打印整个传进来的能看见结构体里面的内容,每个字符数组后面有好多/x00/。
用QBetyarray接收的
array = pSocket->read(2048)

转换是
information *info = (information *)array.data();

结构体是
typedef struct{
unsigned char num; //5
unsigned char name_len; //6
unsigned char name[6]; //"zhudiy"
unsigned char number[6]; //"123456"
unsigned char number_len; //6
unsigned char address[6]; //"china"
unsigned char address_len; //5
}information;

qDebug()<<(char *)info->name;    //可以打出来
qDebug()<<(char *)info->number; //打印出来是空的

感觉是转换有问题,没有跟结构体对应,不知道怎么办了
...全文
409 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zarelaky 2019-05-31
  • 打赏
  • 举报
回复
数据是怎么发的,
你使用这个结构体装数据,然后发这个结构体
636f6c696e 2019-05-18
  • 打赏
  • 举报
回复
为什么字符串数组长度这么小呢?按照你的注释,name、number全部都越界了。 字符串数组长度必须是最大可能字符串长度+1,这个1就是\0的长度,不然输出函数也不知道什么味终止符
    unsigned char num;                     //5
    unsigned char name_len;             //6
    unsigned char name[6];               //"zhudiy"
    unsigned char number[6];           //"123456"
    unsigned char number_len;        //6
    unsigned char address[6];          //"china"
    unsigned char address_len;        //5
AlbertS 2019-05-17
  • 打赏
  • 举报
回复
引用 6 楼 Mandy. 的回复:
试了,也不行。

都换成整数int试试,要是可以就是字节对齐的问题,改变结构体试试就能发现问题
Mind_Kid 2019-05-17
  • 打赏
  • 举报
回复
引用 5 楼 AlbertS 的回复:
faso

[quote=引用 4 楼 Mandy. 的回复:]
[quote=引用 1 楼 AlbertS 的回复:]
是不是字节对齐有问题

感觉是对齐有问题,但是不知道怎么解决,单个字符的都好
[/quote]

#pragma pack(push,1)
typedef struct{
unsigned char num; //5
unsigned char name_len; //6
unsigned char name[6]; //"zhudiy"
unsigned char number[6]; //"123456"
unsigned char number_len; //6
unsigned char address[6]; //"china"
unsigned char address_len; //5
}information;
#pragma pack(pop)

这个结构体的发送端和接收端用的是同一个文件吗?
按一字节对齐试试[/quote]
试了,也不行。
AlbertS 2019-05-17
  • 打赏
  • 举报
回复
faso

引用 4 楼 Mandy. 的回复:
[quote=引用 1 楼 AlbertS 的回复:]
是不是字节对齐有问题

感觉是对齐有问题,但是不知道怎么解决,单个字符的都好
[/quote]

#pragma pack(push,1)
typedef struct{
unsigned char num; //5
unsigned char name_len; //6
unsigned char name[6]; //"zhudiy"
unsigned char number[6]; //"123456"
unsigned char number_len; //6
unsigned char address[6]; //"china"
unsigned char address_len; //5
}information;
#pragma pack(pop)

这个结构体的发送端和接收端用的是同一个文件吗?
按一字节对齐试试
Mind_Kid 2019-05-17
  • 打赏
  • 举报
回复
引用 1 楼 AlbertS 的回复:
是不是字节对齐有问题

感觉是对齐有问题,但是不知道怎么解决,单个字符的都好
Mind_Kid 2019-05-17
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
char[]不一定是字符串,它们不一定是按\0结尾的
所以你可以用个循环来逐个打印char[]里面的所有字符,遇到'\0'或者到达最大长度则结束

也试着一个一个字符打印,但还是只有第一个name能打出来,后面的就不行了
stherix 2019-05-17
  • 打赏
  • 举报
回复
char[]不一定是字符串,它们不一定是按\0结尾的 所以你可以用个循环来逐个打印char[]里面的所有字符,遇到'\0'或者到达最大长度则结束
AlbertS 2019-05-17
  • 打赏
  • 举报
回复
是不是字节对齐有问题

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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