Шестнадцатеричный пакет в C - PullRequest
0 голосов
/ 18 марта 2019

У меня есть устройство 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 [] , и это обычный текст .. Почему я получаю другой вывод от того, который я получаю с Геркулесом?

Как я могу воспроизвести вывод, подобный показанному в Геркулесе?

EDIT -----

На основе входной символьной строки, например char mytest[] = 020441010C0000003131203131203131313103

Как мне достичь:

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

Я считаю, что мне нужно разделить на 2, но я боюсь, что это не отформатирует должным образом. Если мне здесь кто-нибудь поможет, я сам получу ответ.

...