2

我正在尝试将一些 PHP 转换为 C#,但按位函数给了我不同的结果。

PHP 将返回 248

protected function readInt8()
{
    $ret = 0;
    if (strlen($this->_input) >= 1)
    {
        $sbstr = substr($this->_input, 0, 1);
        $ret = ord($sbstr);
        $this->_input = substr($this->_input, 1);
    }
    return $ret;
}

C# 将返回 63

private int ReadInt8()
{
    int ret = 0;
    if (input.Length >= 1)
    {
        string substr = input.Substring(0, 1);
        ASCIIEncoding ascii = new ASCIIEncoding();
        byte[] buffer = ascii.GetBytes(substr);
        ret = buffer[0]; // 63

        this.input = this.input.Substring(1);
    }

    return ret;
}

否则它将返回 14337

private int ReadInt8()
{
    int ret = 0;

    if (input.Length >= 1)
    {
        string substr = input.Substring(0, 1);

        ret = (int)(substr[0]); // 14337
        this.input = this.input.Substring(1);
    }

    return ret;
}

这里的另一个问题适用于较大的值,但不适用于较小的值。我想知道问题是什么。

对不起。昨天有点晚了。

来自服务器的字节

使用以下函数转换的输入 = "Ԁϸ㠁Ǹϸ붻ȁ";

public string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}

关于换班。我认为它可能需要转变,因为 ReadInt16() 需要它。

private int ReadInt16()
{
    int ret = 0;
    if (input.Length >= 2)
    {
        ret  = ((int)(this.input.Substring(0, 1)[0]) & 0xffff) >> 8;
        ret |= ((int)(this.input.Substring(1, 1)[0]) & 0x0000) >> 0;
        this.input = input.Substring(2);
    }
    return ret;
 }

我应该说。我可能误解了 PHP 中函数的使用。

4

1 回答 1

2

不要将字符串视为等同于字节数组。字符编码会干扰和破坏数据(如果它实际上不是文本)。如果您必须将原始数据作为文本传输,则必须对其进行适当的编码/解码,例如使用 base64 编码。

于 2012-09-18T21:42:29.850 回答