php中网络字节顺序到主机字节顺序的转换
我需要开发一个PHP服务器套接字和一个C客户端套接字,反之亦然 我对C中的TCP套接字及其概念了如指掌 我被最后一件事缠住了 我能够从C客户端套接字发送一个完整的结构,如下所示 我正确地得到字符串和字符,但没有正确地得到整数和浮点,我确信它的网络承载字节顺序的小端、大端问题 i、 e.我得到的整数值为436207616 有谁能告诉我如何在PHP中实现与ntohl和ntohs等效的功能吗php中网络字节顺序到主机字节顺序的转换,php,c,Php,C,我需要开发一个PHP服务器套接字和一个C客户端套接字,反之亦然 我对C中的TCP套接字及其概念了如指掌 我被最后一件事缠住了 我能够从C客户端套接字发送一个完整的结构,如下所示 我正确地得到字符串和字符,但没有正确地得到整数和浮点,我确信它的网络承载字节顺序的小端、大端问题 i、 e.我得到的整数值为436207616 有谁能告诉我如何在PHP中实现与ntohl和ntohs等效的功能吗 附言:-我对PHP很陌生。。。请帮助我已经禁用了C中的结构填充,如下所示,它工作了 如何禁用结构填充?如下。
附言:-我对PHP很陌生。。。请帮助我已经禁用了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);
问题很可能不是字节排序,而是结构填充。请记住,大多数C编译器填充其结构,以便字段以偶数地址开始。在结构中的字符之后,很可能有一个3字节的填充字段,您在PHP代码中没有处理该字段。通过在C源代码中打印sizeofstruct\u测试,您可以很容易地实现这一点,我敢打赌它是44而不是41。ya joachim,没错。。。我正在进一步检查。。。但是你可以建议如何在PHP中为这种情况编写解包函数吗,因为我在PHP是新手。大多数编译器都支持结构打包,以最小化填充或完全删除它。当然,您可以使用填充,但在PHP中解包时,在“Chr”之后添加三个虚拟字节。请注意,更改结构将更改填充。添加到Joachim,我会在应用程序启动时将空结构的大小发送到服务器,你可以强迫你的编译器不添加填充,或者你可以按照以下顺序重新组织你的结构:str,i,f,ct在gcc和clang中做这件事的首选方法是使用_属性_packed而不是pragma.ya我也同意@dho。。。请参阅本文,不要使用$input=trim$input;在解包方法之前的php代码中,由于此方法将从字符串的开头和结尾删除空格或其他字符,这将使二进制字符串对于任何解包方法都不可读….trim将删除普通空格、制表符、换行符、回车符、,NUL字节和垂直标签…哇,有人降低了我对答案的声望点。他说那很有趣。
#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)
$arr = unpack("Z32Str/z4Chr/iInt/fFlt", $input);