1

整数を文字列形式に変換することで、いくつかの問題に遭遇しました。C# でまさに必要としているこれらの PHP 関数を取得しました。

function _hex($int)
{
    return (strlen(sprintf("%X", $int)) % 2 == 0) ? sprintf("%X", $int) : sprintf("0%X",     $int);
}
Function hex2str($hexstr)
{
    $hexstr = str_replace(' ', '', $hexstr);
    $hexstr = str_replace('\x', '', $hexstr);
    $retstr = pack('H*', $hexstr);
    return $retstr;
}

彼らはそう呼ばれます:

$total_length = hex2str(_hex(strlen($content)));

C#で私はこれを試しました:

String test = "1234567890123456789012345678901234567890123456789";
short l = (short)test.Length;
byte[] TotalLength = Encoding.GetEncoding(28591).GetBytes(l.ToString());

PHPs HexDump の結果は00 3C- C# では34 39

結果は次の形式の文字列として期待されます。

\x00\x3c

こんにちは、モーリッツ

4

2 に答える 2

1

あなたのコード例に基づいて、値 34/39 は出力バイトの正しくフォーマットされた 16 進数であるため、どのように 00/3C を思いついたのかわかりません。

ただし、C# で数値を 16 進文字列に変換するには、; を使用します。

string hex = String.Format("{0:X}", number);

または、より具体的なケースでは;

StringBuilder sb = new StringBuilder();
foreach (byte b in TotalLength)
{
    sb.Append(String.Format("\x{0:X}", b));
}
string hex = sb.ToString();
于 2012-05-29T21:09:36.587 に答える
1

コードは、文字列に変換された値の ASCII 値を返しますl(ASCII 34/39 は 49 - 文字列の長さ)。しかし、必要なのは、長さの値の byte[] 表現です。

行を変更する

byte[] TotalLength = Encoding.GetEncoding(28591).GetBytes(l.ToString());

byte[] TotalLength = BitConverter.GetBytes(l);

Intel CPU では、値 15 は 00-0F ではなく 0F-00 に変換されることに注意してください。上位バイトが最初に来ます。バイト配列を文字列に変換するときは、これに注意する必要があります。

バイト値を 16 進文字列に変換するには、次を使用します。

var sb = new StringBuilder();
for (int i = TotalLength.Length - 1; i >= 0; i--)
{
    sb.Append("\\x");
    sb.Append(TotalLength[i].ToString("x2"));
}
string hex = sb.ToString();

PS: ローカル変数は小文字で始める必要があります。

于 2012-05-29T21:13:20.630 に答える