【问题标题】:Legacy C# to PHP旧版 C# 到 PHP
【发布时间】:2014-07-17 08:24:27
【问题描述】:

我最近接管了一项旧服务,并且正在将其转换为 PHP,但是我已经被 C# 更复杂的功能所困扰。

据我所知,请求消息长度需要打包,然后在发送到服务之前与实际消息连接。

string strReceiveBuffer;
string msg1 = string.Empty;
msg1 = msg1 + txtRqst.Text;
Int64 intMessageLength = msg1.Length;
byte byt1; byte byt2;

//The below should work assuming a 16 bit register.
byt1 = Convert.ToByte(decimal.Truncate(intMessageLength/ 256));
byt2 = Convert.ToByte(decimal.Remainder(intMessageLength, 256));
string strLength = string.Empty;
strLength = strLength 
    + Microsoft.VisualBasic.Strings.Chr(byt1).ToString() 
    + Microsoft.VisualBasic.Strings.Chr(byt2).ToString();

//Only encode the length using BigEndianCode, the message content is encoded using UTF8
byte[] byteData = Encoding.BigEndianUnicode.GetBytes(strLength)
    .Concat(Encoding.UTF8.GetBytes(msg1)).ToArray();

在我把头发扯掉之前,有人能帮忙处理上面的代码吗?

【问题讨论】:

    标签: c# php tcp


    【解决方案1】:

    如果我正确解释了您发布的代码,这应该可以解决问题(作为旁注,我的天哪,这是一些糟糕的代码)。

    function encodeMessage($msg) {
        $data = ""; 
        $length = strlen($msg);
    
        $data .= pack('n', floor($length / 256)) . pack('n', $length % 256);
        $data .= $msg;
    
        return $data;
    }
    

    编辑:我不明白原始代码背后的原因。出于某种原因,它将长度转换为两个单独的字节(因子和模数为 256),然后将这些字节连接成一个字符串,最后使用 Unicode 将长度编码为一个 4 字节数组。由于Convert.ToByte,您实际上无法使用length > (2^16 - 1)(可以保存在2个字节中)对字符串进行编码,但无论如何最终都会使用4个字节来编码长度,这很奇怪。

    【讨论】:

    • 这个来自官方文档: & & & 表示消息的长度字符串(4 个字节)
    【解决方案2】:

    对于必须将 C# 转换为 PHP 的任何人,祝你好运。在与编码和解码的变化作斗争后,我终于设法将其翻译成 PHP。

    function convertRequest($msg) {
        $length = strlen($msg);
        $byt1 = intval($length / 256);
        $byt2 = $length % 256;
        $strLength = mb_convert_encoding((string) chr($byt1) . (string) chr($byt2), 'UTF-16BE');
        $msg = mb_convert_encoding($msg, 'UTF-8');
        $data = $strLength . $msg;
        return $data;
    }
    

    【讨论】:

    • 问题不一定是将 C# 转换为 PHP,而是将任何语言编写的糟糕代码转换成问题。
    猜你喜欢
    • 2013-09-06
    • 2012-09-09
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多