一部の 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 での関数の使用法を誤解した可能性があります。