简体   繁体   English

将字符串十六进制转换为C中的SOCKET的Binary PACK

[英]Convert string Hexadecimal to Binary PACK in C for SOCKET

I need help with a code that I must pass from PHP to C. The code allows to send via SOCKET an instruction to a remote device. 我需要有关必须从PHP传递到C的代码的帮助。该代码允许通过SOCKET向远程设备发送指令。 It works perfect for me in PHP, but I have to convert it to C. Everything is fine, except PHP's pack () function, I do not see how to replace it in C. Basically I have to pass this: 它对我来说在PHP中很完美,但是我必须将其转换为C。一切都很好,除了PHP的pack()函数,我看不到如何在C中替换它。基本上,我必须通过此操作:

$message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19");

A mesaje_in_c = ¿ ? mesaje_in_c =¿

I would appreciate the support you can give me, thanks! 谢谢您能给予我的支持,谢谢!

This is the PHP code: 这是PHP代码:

<?php

$host    = "192.168.0.140";
$port    = 8081;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    print "socket_create() falló: razón: " . socket_strerror(socket_last_error()) ."\n";
} else {
    print "create socket OK.\n";
}

socket_set_option(
  $socket,
  SOL_SOCKET,  // socket level
  SO_RCVTIMEO, // timeout option
  array(
    "sec"=>10, // Timeout in seconds
    "usec"=>0  // I assume timeout in microseconds
    )
  );

// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
if ($result === false) {
    print "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    print "connect to server OK.\n";
}

$message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19"); 
echo "Message To server Bin: ".$message."\n";
echo "Message dec: ";
print_r(unpack("H*", $message))."\n"; 

// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");

// get server response
$result = socket_read($socket, 1024) or die("Could not read server response\n");

print "Reply From Server  Bin:".$result."\n";

$resultHex = unpack("H*", $result);
print "Reply From Server  Hex:";
print_r($resultHex)."\n";

// close socket
socket_close($socket);
?>

And this is the C code to finish: 这是要完成的C代码:

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc , char *argv[]){

    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message , server_reply[2000];
    int recv_size;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("192.168.0.140");
    server.sin_family = AF_INET;
    server.sin_port = htons(8081);

    //Connect to remote server
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");

    //Send some data
    message = "a5000000015e0000bc19";
    // ???? message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19");

    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        system("pause");
        return 1;
    }
    puts("Data Send\n");

    //Receive a reply from the server
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }

    puts("Reply received\n");

    //Add a NULL terminating character to make it a proper string before printing
    server_reply[recv_size] = '\0';
    puts(server_reply);

    system("pause");
    return 0;
}

I would appreciate the support you can give me, thanks! 谢谢您能给予我的支持,谢谢!

它行得通吗?

char message[] = "\xa5\x00\x00\x00\x01\x5e\x00\x00\xbc\x19";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM