网络字节顺序到php中的主机字节顺序转换

时间:2015-01-03 07:23:44

标签: php c

我需要开发一个PHP服务器套接字和一个C客户端套接字,反之亦然。

我完全使用C语言中的TCP套接字及其概念。

我被困在最后一件事上。

我能够从C客户端套接字发送整个结构,如下所示

typedef struct _test {
char str[32];
char c;
int i;
float f;
}test;

//Some Coding ...

memset(&t,'\0',sizeof(test));

strcpy(t.str,"Sunny"); //String
t.c = 'M'; //Char
t.i = 26; //Integer
t.f = 98.8; //Float

//Send test STRUCT to server
if(send(sockfd,(void *)&t,sizeof(t),0) < 0)  
{   
    perror("Send failed ");
    exit(0);
}

//一些编码......

我在PHP服务器套接字上收到此结构,如下所示

...

 $client = socket_accept($socket);

   $input = socket_read($client, 1024);

   $arr = unpack("Z32Str/a1Chr/iInt/fFlt", $input);

   echo $arr['Str']; //Print String

   echo $arr['Chr']; //Print Char

   echo $arr['Int']; //Print Int

   echo $arr['Flt']; //Print Float

...

我正在正确获取字符串和字符,但是我没有正确地获得Integer和Float,我确信它的网络可以承载字节顺序(小端,大端)问题。

即。我的整数value436207616

任何人都可以告诉我如何在PHP中对ntohl和ntohs进行等效的功能。


P.S。 : - 非常新的PHP ...请帮助

1 个答案:

答案 0 :(得分:-1)

我已经在C中禁用了结构填充,如下所示,它起作用.....

如何禁用结构填充?如下 .... 以下是在C中使用pragma禁用结构填充的方法。

#pragma pack(push, 1)
//Define your structure here
#pragma pack(pop)
//Structure padding is re enabled.


#pragma pack(push,1)
typedef struct _test {
    char str[32];
    char c;
    int i;
    float f;
}test;
#pragma pack(pop)

或者:

我在C中保持填充并在php端执行以下操作,并且它有效....

$arr = unpack("Z32Str/z4Chr/iInt/fFlt", $input);