1

外部インターフェイスの暗号化を実装する必要があります。インターフェースの所有者は、私たちの側で同じ暗号化を実行する方法のドキュメントを提供しています。ただし、このドキュメントは C# で書かれており、PHP で作業しています。

ハッシュを int に型キャストしているように見える部分を除いて、私たちが理解しているほとんどの部分。彼らのコードは次のとおりです。

// hashString exists and is a md5 a like string
int[] keyBuffer = new int[hashString.length];
for (int i=0; i<hashString.length; i++) {
    keyBuffer[i] = (int)hashString[i];
}

PHP では、文字を int としてキャストすると、0 (int) が返されます。これがサードパーティの意図するところだとは想像できないため、C# は別のことを行うと考えています。

C# も int 0 または char にキャストしますか?

次に、元の hashString の長さは 320 です。これは、コードが 320 の長さの int を作成することを意味します?? PHP では、C# のようにメモリを予約するという考えはありません。しかし、320 の長い文字列を int に型キャストしようとすると、19 '文字' の長さの int が得られます。

文字列で本当に長い「数値」を型キャストするとき、C#は短いintも作成しますか?

4

5 に答える 5

10

を に変換しcharていintます。Acharは UTF-16 コード単位 - 符号なし 16 ビット整数 (範囲は[0, 65535]) です。基本的に、その値は 32 ビットの符号付き整数に拡張されます。たとえば'A'、最終的には 65 になり、ユーロ記号 (U+20AC) は最終的に 8364 (0x20ac) になります。

2 番目の部分についてはint、 を作成し、int 配列を作成しています。はい、320​​ 要素の配列を作成します。

于 2012-06-19T13:41:34.573 に答える
1

C#文字列はUTF16です。UTF16文字をintにキャストすると、16ビットのUTF16文字の値が32ビットのintにコピーされるだけです。

于 2012-06-19T13:42:02.807 に答える
1

コードは実際にchar(通常はASCII)をint「0」から0ではなく、にキャストします。したがって、元の文字列が「d131dd02c5e6eec4」の場合、結果の配列はint [] {100、49、51、49、100、100、 48、50、99、53、101、54、101、101、99、52}。

ordしたがって、PHPスクリプトに関数が必要だと思います。

編集:

ちょっとした注意ですが、PHPでstringtoをキャストするとint、実際にはにフレーズが含まれる可能性がありますint。最大のintPHPハンドルは、OSに応じて32ビットまたは64ビットのいずれかです。そのため、19文字の長さのintが得られます。これは、 64ビット整数

charC#には、1つのUnicode文字を表し、整数に直接キャストできる、と呼ばれる別の変数タイプがあります。stringC#のをC#のint直接にキャストすることはできません。

EDIT2: あなたのPHPスクリプトは次のようになっていると思います:

<?php
$keyBuffer = new array();
for ($i=0; $i<strlen($hashString); $i++) {
    $keyBuffer[$i] = ord($hashString[i]);
}
?>
于 2012-06-19T13:48:44.347 に答える
1

C# は文字を int にキャストでき、文字コードが得られます。上記のコードは、文字列 を取り、hashStringそれを整数の配列 に変換していますkeybuffer[]C# では、インデクサー構文を使用して、文字列を char の配列のように扱うことができます。上記のコードは、ハッシュ文字列の文字ごとに 1 つの int の配列を生成し、各 int は対応する文字の文字コードになります。

于 2012-06-19T13:47:00.980 に答える
1

Jon Skeet の投稿をさらに詳しく説明すると、「10 進数」の整数値は、下の図のように対応するchar値にマップされます (これは、開発用 PC で何年も使用されています)。

integerしたがって、値 0 を aにキャストすると、 acharが返されNULLます。

アスキーテーブル

編集:元の質問を見ると、文字列を整数の配列にキャストするのではなく、 MD5 の例を見る方が適切である可能性があります。

于 2012-06-19T13:47:09.917 に答える