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 に答える