1

-- bgnd 情報を追加して編集 --

(ブラック ボックスの) COM オブジェクトが文字列を返します。2 番目の COM オブジェクトは、入力として byte[] と同じ文字列を想定し、処理されたデータを含む byte[] を返します。これは、クライアント側のスタンドアロン アプリケーションにロードされる、ダウンロード可能な、人間が判読できないファイルとしてブラウザに供給されます。

そのため、最初の COM から文字列 inputString を取得し、次のように byte[] に変換します

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, inputString);
obj = ms.ToArray();

それを 2 番目の COM にフィードし、読み戻します。結果はブラウザに書き込まれます。

Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment; filename="test.dat");
Response.BinaryWrite(obj);

フォーマットが正しくないため、2 番目の COm でエラーが発生します。元の文字列を確認しに行きましたが、まったく問題ありませんでした。次に、最初の com からの結果をブラウザに直接送り、何が表示されるかを見ました。道路のどこかに、判読できない余分な文字が追加されているようです。これらのキャラクターとは何ですか?何に使用されますか?どうすれば 2 番目の COM が停止するのを防ぐことができますか?

読めない文字は次のようなものです。

NUL/SOH/NUL/NUL/NUL/FF/FF/FF/FF/SOH/NUL/NUL/NULなど

何か案は?

--答え
--

System.Text.Encoding.UTF8.GetBytes(theString)

むしろその後

BinaryFormatter.Serialize()
4

5 に答える 5

2

BinaryFormatter は、ほぼ確実に使用したいものではありません。

もちろん、文字列をバイトに変換するだけの場合は、適切なエンコーディングのためにEncoding.GetBytesを使用してください。通常は UTF-8 が正しいですが、ドキュメントでエンコーディングが指定されているかどうかを確認してください。

于 2008-12-05T10:58:05.277 に答える
1

さて、更新された情報で: 2 番目の COM オブジェクトはバイナリ データを想定していますが、そのバイナリ データを文字列から作成したいと考えています。それはプレーンなバイナリデータとして扱われますか?

私の推測では、何かがクライアント側でこのプロセスを逆転させようとしているのです。最終的にデータを文字列として再構築する必要がある場合は、使用する適切なエンコーディングを選択し、それを両側で使用する必要があります。ほとんどの場合、UTF-8 が適していますがクライアント側でデータをファイルに書き出して XML ファイルとして使用するだけの場合は、XML に基づいて適切なエンコーディングを選択する必要があります。

前に、文字列の最初の数文字だけ"<foo>"(または似たようなもの) だとおっしゃいましたが、それは XML 宣言がないということですか? そうでない場合は、UTF-8 を選択してください。それ以外の場合は、XML 宣言を調べて、それを使用してエンコーディングを決定する必要があります (宣言でエンコーディングが指定されていない場合は、デフォルトで UTF-8 になります)。

適切なエンコーディングを取得したら、以前の回答で述べたように Encoding.GetBytes を使用します。

于 2008-12-05T11:22:17.663 に答える
1

BinarySerialization の要点が欠けていると思います。

まず、formulaXml とはどのタイプですか?

バイナリ シリアライゼーションは、それを XML ではなく、機械表現の値に圧縮します。内容は次のようになります。

    ÿÿÿÿ          AIronScheme, Version=1.0.0.0, Culture=neutral, Public

おそらく、代わりに XML シリアライザーを確認する必要があります。

アップデート:

XML を 'content-disposition' ストリームとして書き出したいとします。

これを行うには、次のようにします。

byte[] buffer = Encoding.Default.GetBytes(formulaXml);
Response.BinaryWrite(buffer);

それはあなたが望んでいたように機能するはずです(私は思う)。

于 2008-12-05T10:52:01.467 に答える
1

の仕事は、オブジェクトを、相手側BinaryFormatterだけが理解できる不透明なシリアライゼーション形式に変換することです。BinaryFormatter

(ちょうど言及しようとしEncoding.GetBytesていますが、ジョンは私を打ち負かしました。)

System.Text.Encoding.UTF8.GetBytes() を使用することをお勧めします。

于 2008-12-05T11:00:26.457 に答える
0

最初のがらくたは2バイト長ですか?

これは、Unicode でエンコードされた文字列のバイト オーダー マークである可能性があります。

http://en.wikipedia.org/wiki/Byte-order_mark

于 2008-12-05T10:52:24.743 に答える