Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中网络字节顺序到主机字节顺序的转换_Php_C - Fatal编程技术网

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

php中网络字节顺序到主机字节顺序的转换,php,c,Php,C,我需要开发一个PHP服务器套接字和一个C客户端套接字,反之亦然 我对C中的TCP套接字及其概念了如指掌 我被最后一件事缠住了 我能够从C客户端套接字发送一个完整的结构,如下所示 我正确地得到字符串和字符,但没有正确地得到整数和浮点,我确信它的网络承载字节顺序的小端、大端问题 i、 e.我得到的整数值为436207616 有谁能告诉我如何在PHP中实现与ntohl和ntohs等效的功能吗 附言:-我对PHP很陌生。。。请帮助我已经禁用了C中的结构填充,如下所示,它工作了 如何禁用结构填充?如下。

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

我对C中的TCP套接字及其概念了如指掌

我被最后一件事缠住了

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

我正确地得到字符串和字符,但没有正确地得到整数和浮点,我确信它的网络承载字节顺序的小端、大端问题

i、 e.我得到的整数值为436207616

有谁能告诉我如何在PHP中实现与ntohl和ntohs等效的功能吗


附言:-我对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);