C十六进制封装

时间:2019-03-18 16:31:50

标签: c tcp hex

我有一个CLinux设备,它从串行设备获取触发器,然后转换一些数据,并通过TCP输出到另一个设备(服务器)。

服务器需要获取以下数据:

| STX | 0x04 | 0x41 0x01 | DATA-BYTECOUNT-WORD | Option-BYTE | FIELDNUMBER-BYTE | ASCII STRING | ETX |

我只能使用第三方软件Hercules实现我想要的(下图)。 我正在用Wireshark嗅探数据,在绿色方块中如下所示。

Hercules + Wireshark

这是我正在使用的C代码。

//var definition
int listenfd = 0, connfd = 0;
char testOutput[ ] = {0x02,0x04,0x41,0x01,
                      0x0C,0x00,0x00,0x00,
                      0x31,0x31,0x20,0x31,
                      0x31,0x20,0x31,0x31,
                      0x31,0x31,0x03};
//example

int main( int argc, char *argv[ ] )
{
    int sock;
    struct sockaddr_in server;
    char* message[1000], server_reply[2000];

    //Create socket
    sock = socket( AF_INET, SOCK_STREAM, 0 );
    if( sock == -1 )
    {
        printf( "Could not create socket" );
    }
    puts( "Socket created" );

    server.sin_addr.s_addr = inet_addr( "192.168.0.180" );
    server.sin_family = AF_INET;
    server.sin_port = htons( 3490 );

    if( connect( sock, ( struct sockaddr * )&server, sizeof( server ) ) < 0 )
    {
        perror( "Failed to connect to Server Machine.\n" );
    }
    puts( "Connected to Machine.\n" );

    //keep communicating with server - there's a trigger for each Send before this
    while( 1 )
    {
        if( send( sock, testOutput, 19, 0 ) < 0 )
        {
            puts( "Send failed." );
            break;
        }
    }
    close( sock );
    return 0;
}

使用该代码,我在控制台中有一个“可视”正确的输出,尽管在服务器计算机中没有以正确的方式显示。

我尝试了不同的输出格式,一旦HEX可以作为 char [] 传输,它是纯文本。 为什么我得到的与赫拉克勒斯的输出不同?

我如何重现Hercules中显示的输出?

编辑-----

基于输入的char字符串,例如 char mytest[] = 020441010C0000003131203131203131313103

我如何实现:

mytest2[] = {0x02,0x04,0x41,0x01, 0x0C,0x00,0x00,0x00,0x31,0x31,0x20,0x31,0x31,0x20,0x31,0x31,0x31,0x31,0x03}

我相信我需要除以2,但是恐怕格式化不正确。 如果有人在这里帮助我,我自己就能得到答案。

0 个答案:

没有答案