質問

数日前、私は尋ねました jpg ファイルなどのバイナリ データを文字列変数に保存できないのはなぜですか.

私が得た答えのほとんどは、文字列は私が今書いていることなどのテキスト情報に使用されると述べていました。

では、テキスト データとはどのようなデータとみなされますか?特定の性質のバイトは jpg ファイルを表し、それらのバイトは文字のバイト値で表すことができると思います。では、文字列がテキスト情報であると言うとき、保存されない文字の範囲またはリストのようなものはあるのでしょうか?

質問がばかげているように聞こえたらごめんなさい。ただ「理解しよう」としているだけ

役に立ちましたか?

解決

文字列にバイナリデータを格納する際に3つの大きな問題があります。

  1. ほとんどのシステムは、文字列変数内で特定のエンコーディングを想定しています-例: UTF-8、UTF-16、またはASCII文字列の場合。システムによっては、改行文字も翻訳される場合があります。
  2. 文字列のサイズの制限に注意する必要があります。
  3. Cスタイルの文字列を使用する場合、データ内のすべてのnull文字は文字列を終了し、実行される文字列操作は最初のnullまでのバイトに対してのみ機能します。
  4. おそらく最も重要なのは、紛らわしいことです。他の開発者は、文字列変数でランダムなバイナリデータを見つけることを期待していません。また、バイナリデータに遭遇すると、文字列で動作する多くのコードが本当に混乱する可能性があります:

他のヒント

バイナリデータをバイナリとして保存することを選択します。テキスト表現に変換すると、いくつかのバイトが無駄になるので、他に選択の余地がない場合にのみテキストに変換することを考えます。 、それは彼らが電子メールに添付ファイルを置く方法です。

Base64 は、バイナリファイルの優れたテキスト表現です。

テキストエンコーディングの問題のバイナリを参照していると思います。 (jpgを文字列に変換するには、そのような前処理が必要になります)

実際、その記事では、一部の文字は常にサポートされているわけではないという記述があり、他の文字は混乱を招く可能性があります:

  

一部のシステムでは、処理できる文字セットがより制限されています。 8ビットクリーンでないだけでなく、印刷可能なすべてのASCII文字を処理できないものもあります。
  その他には、改行間に表示される文字数に制限があります。
  さらに、ヘッダーまたはトレーラーをテキストに追加するものもあります。

     

また、いくつかのよく知られていないがまだ使用されているプロトコルは、インバンドシグナリングを使用し、メッセージに特定のパターンが現れると混乱を引き起こします。最も有名なのは、文字列" From"です。 (末尾のスペースを含む)mboxファイル形式のメールメッセージを区切るために使用される行の先頭。

「バイナリ」データを文字列に入れることはできないと言った人は誰でも間違っていました。文字列は、テキストデータに使用する可能性が最も高いバイトの配列を単に表しますが、必要なデータをそこに入れることを妨げるものは何もありません。

使用している言語がわからないので、注意する必要があります...一部の言語では\ 0で文字列が終了します。

C#では、任意のデータを文字列に挿入できます...例:

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);

国際化の前は、それほど違いはありませんでした。 ASCII文字はすべてバイトなので、文字列、文字配列、およびバイト配列は同じ実装になりました。

ただし、最近では、数千の外国語文字とそれらに付随する言語規則を扱うために、文字列ははるかに複雑です。

確かに、十分に深く見れば、すべてはほんの数バイトだけですが、コンピューターがそれらを解釈する方法には世界の違いがあります。 " text"のルールそれが人間に表示されたときに物事が正しく見えるようにしますが、コンピュータは内部表現で自由に猿です。たとえば、

すべてをバイト単位で詳細に調べます。 文字列や画像のようなものは、バイトの順序に関するルールによって定義されます。 たとえば、文字列は値32(またはその他)のバイトで終了します jpgはありません

言語に依存します。たとえば、Pythonの文字列型(str)は実際にはバイト配列であるため、実際にバイナリデータに使用できます。

Cでは、文字列の終端にNULLバイトが使用されるため、バイナリデータにヌルバイトが含まれる可能性があるため、任意のバイナリデータにスティングを使用することはできません。

C#では、文字列は文字の配列であり、文字は基本的に16ビットintのエイリアスであるため、文字列に任意のバイナリデータを格納することでおそらく回避できます。文字列を表示しようとするとエラーが発生する可能性があり(実際、一部の値は正当なUnicode文字に対応しない可能性があるため)、ケース変換などの一部の操作はおそらく奇妙な方法で失敗します。

一言で言えば、一部の言語では任意のバイナリデータを文字列に格納することが可能かもしれませんが、これらはこの用途向けに設計されておらず、あらゆる種類の予期しないトラブルに遭遇する可能性があります。ほとんどの言語には、任意のバイナリデータを格納するためのバイト配列型があります。

同意する ジェイコブス 答え:最終的に、すべてのデータ構造はバイトで構成されます。(まあ、さらに深く掘り下げてみると、ビットの)。ある程度抽象化すると、文字列またはバイト配列は、それらにアクセスする方法に関するプログラマの規則であると言えます。

この点において、文字列はテキストとして解釈されるデータの抽象化です。テキストは人間間のコミュニケーションのために発明されたものであり、コンピューターやプログラムはテキストを使用してうまくコミュニケーションすることができません。SQL はテキストですが、人間がデータベースに何をすべきかを指示するためのインターフェイスです。

したがって、一般に、テキスト データ、つまり文字列は、主に人間と人間、または人間と機械の対話 (メッセージ ボックスのコンテンツなど) に使用されます。他の目的でそれらを使用する (例:バイナリ画像データの読み取りまたは書き込み)は可能ですが、処理するように設計されていないものにデータ型を使用しているため、多くのリスクが伴います。これにより、エラーが発生しやすくなります。バイナリ データを文字列に保存できる場合もありますが、足を撃たれる可能性があるからといって、それは避けるべきです。

まとめ:できますよ。でもやめたほうがいいよ。

元の質問( c#-文字列とは本当に良いものですか?)ほとんど意味がありません。そのため、答えも意味がありませんでした。

元の質問は「なんらかの理由で、この文字列をファイルに書き出すと開かない」と言っていました。これはあまり意味がありません。

元の質問は不完全であり、答えは誤解を招く混乱を招きました。文字列に何でも保存できます。期間。 「文字列はテキスト用です」質問には、特定のC#コードの何が問題なのかを判断するのに十分な情報を提供しなかったため、答えがありました。

コードスニペットまたはエラーメッセージを提供しませんでした。それが「入手」するのが難しい理由です-何が得られないのかを知るための十分な詳細を提供していないのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top