テスト目的で、ランダムな文字列を生成する必要があります。この文字列は、Web 経由で転送するためにバイト配列にエンコードされ、結果の文字列にデコードされます。このテストでは、NUnit フレームワークを使用して、元の文字列と結果の文字列を比較します。エンコードされたバイト配列は Web に適している必要があるため、UTF-8 でエンコードされています。
Encoder.GetBytes
文字列はfromによってバイト配列にエンコードされUTF8Encoding
ます。バイト配列はDecoder.GetChars
fromによって文字列にデコードされます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);
}