3
DateTime todayDateTime = DateTime.Now;
StringBuilder todayDateTimeSB = new StringBuilder("0");
todayDateTimeSB.Append(todayDateTime.ToString("MMddyyyy"));
long todayDateTimeLongValue = Convert.ToInt64(todayDateTimeSB.ToString());
// convert to byte array packed decimal
byte[] packedDecValue = ToComp3UsingStrings(todayDateTimeLongValue); 
// append each byte to the string builder
foreach (byte b in packedDecValue)
{
    sb.Append(b); // bytes 56-60
}
sb.Append(' ', 37);

上記のコードは、現在の日時を取得し、それをlong値にフォーマットし、それをパック10進フォーマットに変換するメソッドに渡します。コードをステップ実行すると、バイト配列には、期待しているすべてのバイトに対して正しい16進値が含まれるため、上記が機能することはわかっています。

ただし、上記は私が問題を抱えているコードです。具体的には、文字列ビルダー.Append(byte)が実際ToString()にそのバイトに対してを実行することを調査して見つけました。これは、バイトを文字列に追加するときにバイトの値を変更します。問題はStringBuilder、「バイト」をそのまま取得し、値をフォーマット/変更せずにメモリに保存するように指示する方法です。.AppendFormat()を使用してフォーマット方法に関する多くのオプションを提供するいくつかのオーバーロードがあることも知っていIFormatProviderますが、データの値をフォーマット/変更/変更しないように指示する方法がわかりません。

4

2 に答える 2

9

バイトをcharにキャストできます。

sb.Append((char)b);

ASCIIEncodingを使用して、すべてのバイトを一度に変換することもできます。

string s = Encoding.ASCII.GetString(packedDecValue);
sb.Append(s);
于 2012-12-21T19:06:51.407 に答える
1

前述のように、Unicode の世界では、バイト (オクテット) は文字ではありません。CLR は内部的に Unicode 文字を処理し、内部的に UTF-16 エンコーディングで表現します。AStringBuilderは、UTF-16 でエンコードされた Unicode 文字列を作成します。

ただし、その UTF-16 文字列を取得したら、たとえば UTF-8 または ASCIIEncoding を使用して再エンコードできます。ただし、これらの両方で、コード ポイント 0x0080 以上はそのままにはなりません。

UTF-8 は、コード ポイント 0x0080 ~ 0x07FF に 2 オクテットを使用します。コード ポイント 0x0800 ~ 0xFFFF などの 3 オクテット。http://en.wikipedia.org/wiki/UTF-8#説明

ASCII エンコーディングはさらに悪い: documentationによると、0x0000–0x007F 以外のコード ポイントは単純にチャックされます。

Encoding.ASCII プロパティまたは ASCIIEncoding コンストラクターによって返される既定のエンコーダーを使用する場合、その範囲外の文字は、エンコード操作が実行される前に疑問符 (?) に置き換えられます。

オクテットのストリームを無傷で送信する必要がある場合は、 aとでSystem.IO.MemoryStreamラップされたを使用することをお勧めします。StreamReaderStreamWriter

その後、そのメソッドまたはそのメソッドMemoryStreamを介して のバッキング ストアにアクセスできます。実際のバッキング ストアへの参照を提供します。ただし、割り当てられているが未使用のバイトが含まれている可能性があります。ストリームのとを確認する必要があります。新しい配列を割り当て、実際のストリーム コンテンツをそこにコピーするため、受け取る配列参照は正しい長さになります。GetBuffer()ToArray()GetBuffer()LengthCapacityToArray()

于 2012-12-21T20:25:40.247 に答える