1

さて、私はインターネットで調べた次のコードを持っていますが、私のプロジェクトでは、コードを使用することは許可されておらず、機能する場合はそれを投入するだけです。私はそれを理解し、コードとそれが何をしているのかについて説明することができなければなりません。

Convert.ToInt32("a").ToString("x");//ascii to hex
String.Join(String.Empty, 
      stringInput.Select(
         c => Convert.ToString(
            Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 

この2行の説明をお願いします。

4

1 に答える 1

1

作成者ができるだけ多くの機能を1行に詰め込もうとしたため、このコードは複雑に見えます。(私が不機嫌な気分だったら、これを「見せびらかす」と呼び、後輩がこれをチェックインしようとすると文句を言うでしょう。)しかし、そのコード行のどの部分も複雑ではありません。少しずつバラバラにして、各ビットを調べてください。

手始めに、その最初の行は単なるごみです。16のベースを指定しなかっToInt32("a")たため、をスローします。ただし、修正すると、が返されます。したがって、その行は無視してください。何も役に立ちません。(著者が戻るようなものを使用することを意図していたことは想像できますが、そうではありませんでした。)FormatExceptionToInt32("a", 16)10.ToString("x")"a"Encoding.UTF8.GetBytes()0x61

2行目では、各ビットを分解して、それが何をするかを確認します。

String.Join(String.Empty, 

これは非常に簡単です。文字列の配列を取得し、区切り文字として使用してそれらを結合しますString.Empty(IOW、分離なし)。

  stringInput.Select(

これがLINQを使用してIEnumerable文字列を構築しているところです。文字列内の文字を一度に1つずつループし、それぞれに対してラムダ式を実行します。

     c => Convert.ToString(
        Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 

これらの括弧を目で一致させるのは面倒なので、ここで厄介になりますが、ネストされた関数呼び出しを一時的なものに拡張すると、次のようになります。

s = c.ToString();              // Convert the character to a string
u = Convert.ToUInt32(s, 16);   // Convert a string of hex digits to a uint
b = Convert.ToString(u, 2);    // Convert a uint to a string of binary digits.
return b.PadLeft(4, '0')));    // Add 0s to make the string at least 4 digits.

これらの「返された」値のそれぞれが、列挙可能な要素の次の要素になります。この要素は、によって返されSelect、次に結合されます。

ここでの最終結果は、0からFまでの16進数の文字列で始まり、数値として読み取られると特定の数値を持ち、2進数の0と1の文字列で終わります。数値は、同じ数値です。IOW、あなたは16進数の文字列を2進数の「同等の」文字列に「変換」しています。

于 2012-11-27T01:03:27.387 に答える