3

テスト目的で、ランダムな文字列を生成する必要があります。この文字列は、Web 経由で転送するためにバイト配列にエンコードされ、結果の文字列にデコードされます。このテストでは、NUnit フレームワークを使用して、元の文字列と結果の文字列を比較します。エンコードされたバイト配列は Web に適している必要があるため、UTF-8 でエンコードされています。

Encoder.GetBytes文字列はfromによってバイト配列にエンコードされUTF8Encodingます。バイト配列はDecoder.GetCharsfromによって文字列にデコードされますUTF8Encoding

元の文字列はランダムに生成する必要があり、UTF-8 エンコーディングを使用してエンコード/デコードできる任意の文字列を含める必要があります。

文字列を生成する最初の試みは次のとおりです。

   public static String RandomString(Random rnd, Int32 length) {
          StringBuilder str = new StringBuilder(length);
          for (int i = 0; i < length; i++)
                 str.Append((char)rnd.Next(char.MinValue, char.MaxValue));
          return str.ToString();
   }

上記のコードは、エンコードするシーケンスが無効な文字列を生成します。

Web でいくつかの提案を見つけ、コードを改善しました。

   public static String RandomString(Random rnd, Int32 length) {
          StringBuilder str = new StringBuilder(length);
          for (int i = 0; i < length; i++) {
                 char c = (char)rnd.Next(char.MinValue, char.MaxValue);
                 while (c >= 0xD800 && c <= 0xDFFF)
                        c = (char)rnd.Next(char.MinValue, char.MaxValue);
                 str.Append(c);
          return str.ToString();
   }

上記のコードはエンコードに問題はありませんが、バイト配列のデコードに失敗します。さらに、コードが考えられるすべてのケースをカバーできるかどうかはわかりません。

任意の提案、C# で指定された要件を持つランダムな文字列を生成する方法。

UPD : エンコード/デコードでランダムな文字列を使用する:

   public static Encoder Utf8Encode = new UTF8Encoding(false, true).GetEncoder();
   public static Decoder Utf8Decode = new UTF8Encoding(false, true).GetDecoder();

   public unsafe void TestString(Random rnd, int length, byte* byteArray, 
                 int arrayLenght) {
          int encodedLen;
          String str = RandomString(rnd, length);
          fixed (char* pStr = str) {
                 encodedLen = Utf8Encode.GetBytes(pStr, str.Length, byteArray,
                        arrayLenght, true);
          }
          char* buffer = stackalloc char[8192];
          int decodedLen = Utf8Decode.GetChars(byteArray, encodedLen, buffer, 
                 8192, true);
          String res = new String(buffer, 0, decodedLen);
          Assert.AreEqual(str, res);
   }
4

1 に答える 1