• 6239阅读
  • 5回复

[提问]Qt tcp Linux c 数据通信问题 [复制链接]

上一主题 下一主题
离线djnxqc
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-09

    以下是Linux c发送的数据部分
      unsigned char buf[20];
       memset(buf,0,sizeof(buf));
    buf[0]=0x12;
    buf[1]=0x13;
    buf[2]=0x14;
    buf[3]=0x7c;
    buf[4]=0xfe;
    buf[5]=0xe8;
    buf[6]='a';
    buf[7]='b';
    buf[8]='c';
    buf[9]=0xfc;
    buf[10]=0xcf;
    buf[11]=0xaa;
    buf[12]=0x00;
    buf[13]=0x30;
    buf[14]=0x7f;
    buf[15]=0x90;
        send(client_fd,buf,16,0);

windows下qt tcp接受部分:

void Dialog::receiveData()
{
    tcpSocket.setReadBufferSize(1024);
    QByteArray ba=tcpSocket.readAll();

    qDebug()<<"qbytearray"<<ba.length();//收到的字节数和发送的字节数一样,即使中间字节ascci值为0;


    for(int n=0;n<ba.length();n++)
        //qDebug("ba[%d]:%d",n,ba[n]);//程序运行错误
        qDebug()<<ba[n];
    if(ba[0]-0x12== 0)
        qDebug("======0");
    if(ba[1]-0x13==0)
        qDebug("======1");
    if(ba[2]-0x14==0)
        qDebug("======2");

    if( ba[3]-0x7c== 0)
        qDebug("======3");
    if( ba[3]-0x7c== 0)
        qDebug("======3--1");
    if( ba[4]-0xfe==0 )//这个也没有正确判断出来
        qDebug("======45");

    if(ba[14]==0x31)//内存中的数值好像并不完全和预期一样
        qDebug("======14");

    if(ba[12]==0x00)
        qDebug("======12");
    if(ba[14]==0x7f)
        qDebug("======14n");
    if(ba[15]==0x90)
        qDebug("======15n");
}

为什么这些数据不能正确地接受判断出来呢?或者qt应如何写void Dialog::receiveData()中的数据接收部分呢?


离线dbzhang800

只看该作者 1楼 发表于: 2014-12-09
你这个问题和Tcp没什么关系。和QByteArray有些关系。

看了你问的两个问题。问题都出在你 对 char/signed char/unsigned char/int 等基本类型 缺少理解。

你的QByteArray中是一个个的 char,但无论赋值还是比较,你都在用int型变量 0xfe 而不是 char 型  '\xfe'

离线djnxqc

只看该作者 2楼 发表于: 2014-12-10
回 dbzhang800 的帖子
dbzhang800:你这个问题和Tcp没什么关系。和QByteArray有些关系。
看了你问的两个问题。问题都出在你 对 char/signed char/unsigned char/int 等基本类型 缺少理解。
你的QByteArray中是一个个的 char,但无论赋值还是比较,你都在用int型变量 0xfe 而不是 char 型  '\xfe' .. (2014-12-09 22:39) 

谢谢啦!用 '\xfe'格式,便稀里糊涂的正常了!版主能说下这里的本质区别吗?0xfe虽是int型,可它没超过一个字节呀?
离线dbzhang800

只看该作者 3楼 发表于: 2014-12-10
看下面的例子,然后回答:1. d1/d2/d3 的值分别是多少? 2. 答案是否唯一?


signed char c1 = 0xfe;
int d1 = c1;

unsigned char c2 = 0xfe;
int d2 = c2;

char c3 = 0xfe;
int d3 = c3;

离线djnxqc

只看该作者 4楼 发表于: 2014-12-10
回 dbzhang800 的帖子
dbzhang800:看下面的例子,然后回答:1. d1/d2/d3 的值分别是多少? 2. 答案是否唯一?
signed char c1 = 0xfe;
int d1 = c1;
....... (2014-12-10 11:35) 

1、
d1=-2;d2=254;d3=-2;
在gcc和vc下都编译了,结果也如此。
2、难道结果不唯一,何时会出现不唯一呢?
离线dbzhang800

只看该作者 5楼 发表于: 2014-12-10
回 djnxqc 的帖子
djnxqc:1、
d1=-2;d2=254;d3=-2;
在gcc和vc下都编译了,结果也如此。
2、难道结果不唯一,何时会出现不唯一呢?
....... (2014-12-10 21:07) 

呵呵,说明你对char相关的这三个类型的理解有待加强。

signed char 和 unsigned char 这两个是没有歧义的。但是char就不一样的,它到底带不带符号??C/C++标准对此不作规定。

以你用的gcc和msvc为例,二者都有相应的选项,使你可以控制char是 有符号的,还是无符号的。

也就是说,上面的程序,用同一个编译器编译,不同的编译选项,你就可以看到不同的结果。
快速回复
限100 字节
 
上一个 下一个