実際にバイトストリームとは何ですか?


34

誰が実際にバイトストリームに含まれているのか説明できますか?バイト(16進データ)またはバイナリデータまたは英字のみが含まれていますか?「生データ」という用語についても混乱しています。「4バイトのデータを逆にする」ように頼まれた場合、データは16進コードまたはバイナリコードであると想定する必要がありますか?


私の2セントは価値のある答えではありません(そして以下にすでに良いものがあります)が、実際に何かを意味するために「生データ」がどのように解釈されるかについての良い洞察を提供するこれら2つの記事へのリンクを提供したいだけですあなたは表すようになっているものを知っているとどのようにそれがエンコードされている/保存されていない限り、平均何でも)betterexplained.com/articles/... joelonsoftware.com/articles/Unicode.html
マイケル・

1
私は、文字として理解できないものにc / c ++のcharを使用することを避けるために、javaがバイトを作成したと思います。charのサイズが1バイトであるため、charはc / c ++で頻繁に使用されました。また、UNIXのデバイスはブロックデバイスとキャラクターデバイスです。charデバイスから読み取る場合、unsigned chars / bytesのストリームを取得します。
imel96

バイトストリームがあいまいです。オクテットストリームはそうではありません。
ディアハンター

データは多くのレベルで解釈できます。一番下は、オン/オフの一連の電気レベルです。少し上にあるのは、バイトの塊、またはあなたが言うように、バイトストリームです。さらに上になると、生データの解釈が始まります。バイトは多くの方法(エンコード)でテキストとして解釈できます。整数も(ビッグまたはリトルエンディアン)。さらに高くすることもできます。zipファイルがあります。そのzipファイルは昨日からのバックアップです。等々。問題は、多くの場合、正確なレベルが暗黙的で明確になっていないことであり、これは混乱を招く可能性があります。
ひどく

回答:


52

バイトストリームには、バイトが含まれています。実際の状態に分解すると、1と0で構成される8ビットです。数値を表す場合、0〜255の任意の数値になります(IPアドレスの4つの数値が常に0〜255の範囲にある理由は偶然ではありません)。バイトストリームは、通常、循環バッファーを保持するために使用される基本的な基本バイト配列を隠すことを目的とした高度なインターフェイスです(バッファーをいっぱいにして、誰かが空にするのを待ちますが、その時点でバッファーが再びいっぱいになります)。

それは一体何を表していますか?まあ、テキストファイル、画像、またはライブビデオストリームを表すことができます。それ何であるか、それを読んでいる人のコンテキストに完全に依存しています。16進表現は同じことを言う別の方法です。ただし、同じことですが、数字よりも16進表現でバイトを管理する方が便利な場合があります。

生データを参照している場合、通常はバイトデータを参照しています。データには「私は画像ファイルです!」というタグが付いていません。通常、生データを扱うのは、データが全体的に何を表しているのかを本当に気にしないときだけです。たとえば、画像を白黒バージョンに変換したい場合、画像の生データを読み取り、3バイトごとに読み取る(実際には赤色の表現、緑色の表現、および青色)、その数値を追加して3で除算し、その値を3回書き込みます。基本的に私がやろうとしているのは、ピクセルの赤、緑、青の値を平均し、そこからグレーに相当するピクセルを作ることです。ただし、「バイト単位」のレベルでデータに操作を実行することについて話すときは、

または、ファイルをデータベースに保存したいが、その「生データ」をblobデータ型に挿入するように求められます。これは、単にファイルのデータを、データベースが理解および管理できる大きなバイト配列に変換することを意味します。データベースからその値を取得すると、最初にデータベースに提供した最初の1つの大きなバイト配列になります。そのデータがファイルである場合、プログラマーは、ファイルを一度に1バイトずつ読み取っているように、そのバイトデータを再解釈する必要があります。

「4バイトのデータを逆にする」ように頼まれた場合、それはビッグエンディアン対リトルエンディアンの数字の解釈を指し、最上位バイトまたは最下位バイトで始まる数字を書き込むと思います。数値がビッグエンディアンとリトルエンディアンのどちらで表されるかは問題ではなく、数値を読み取るすべてのシステムが一貫して解釈するだけです。

これは、実際の数値表現(または16進表現)が変更されたということではなく、単にこれら4バイトが数値を作成する順序を逆にする必要があるということです。0x01、0x02、0x03、および0x04があるとします。これらを逆にするには、代わりに0x04、0x03、0x02、0x01を使用します。システムはおそらくこれらの4バイトを逆の順序で読み取り、すでに逆にしたため、値は生データで意図されたものとまったく同じであると解釈されます。

これで説明できればと思います!


すべて順調 ..!「生データ」についての回答を詳しく説明していただけますか?
user2720323

@ user2720323わかりました、より良い「生データ」を説明するために修正されました。:)
ニール

心に留めておくべきことの1つは...すべてのデータは単にバイトのコレクションです。これらのバイトの意味は、何らかのメタデータ(ファイル拡張子、データベースフィールドなど)によって定義されます。画像ファイルはASCIIファイルとして解釈でき、その逆も可能です。テキストまたは画像は無意味かもしれませんが、それでも可能です。(DERP ...私は次の答えを読む必要があります)
デイブいや

2
@kevincline私がアイデアを伝えようとしているという事実に感謝してみてください。私の優先事項は、正確なアルゴリズムを書くことではありません。より正確にしたい場合は、人間の目が知覚できるものに応じて、赤、緑、青の値を比較検討します。
ニール

18

バイトは単なる情報の単位であり、何でもかまいません。バイト自体は何の意味もありません。何らかの意味を付加する必要があります。

それで、それを拡張するために-

バイト(16進データ)またはバイナリデータまたは英字のみが含まれていますか?

16進データはバイナリデータと同じです。これは、データを表示するための別の方法です。たとえば、0x41 = 0b01000001 = 'A' = 65(10進数)。英語の文字はその一部にすぎません。

「4バイトのデータを逆にする」ように頼まれた場合、データは16進コードまたはバイナリコードであると想定する必要がありますか?

16進数は単なるデータの表現であるため、どのように考えるかは関係ありません。のデータがあれば0x65 0x66 0x67 0x68、それを逆にするためにあなたは得るでしょう0x68 0x67 0x66 0x65。このデータを文字の観点から見ると、元はA B C Dでしたが、現在はですD C B A

バイトストリームに戻る-それは単なるデータのシーケンスです。データを使用するには、データが何を表すかを知る必要があります。テキストファイルを読み込んでいる場合、ファイルを読み込んでいるときに取得するバイトストリームは、ある種の文字になります。実行可能ファイルには、印刷できない文字が多数含まれているため、バイナリファイルと呼ばれます。明らかに、テキストエディターで実行可能ファイルを開くことは可能ですが、何も便利ではありません。


1
+1ですが、latビットのバイナリの強調は見当違いのようです。「バイナリデータ」には印刷できない文字が含まれることがよくありますが、印刷できない文字が含まれているためではなく、バイナリ数字で構成されているため、「バイナリ」と呼ばれます。印刷可能な「テキスト」データに対抗して「バイナリ」を使用していることを理解していますが、これによりOPがさらに混乱する可能性があると思います。
カレブ

私は反転に関する質問があります..ファイルに整数(32ビット)325487がある場合、この4バイト整数を反転するにはどうすればよいですか?同様に、私は単語(「hai how are you」)、すべての文字をバイトと仮定してこの文字列を逆にする方法を持っています。
user2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); これは文字通り各バイトを受け取り、正しい位置にシフトし、他のバイトと結合します。
ニール

2

バイトストリームは、バイトの順序付きシーケンスです。最初のバイトがあり、先行バイトはありません。その後続は2番目のバイトなどです。現在、1バイトは8ビットで構成されると広く理解されています。より正確にしたい場合は、オクテットストリームオクテットという用語を使用します。8ビット幅ではないバイトを持つコンピューターはまだ存在します。

16進数は数値を記述する方法であり、バイナリデータの印刷表現として機能します。16進数は実際にはテキストです。たとえば、16進値FEは1バイト(1111111010進値を持つビット)を表す場合があります255。ただしFE、実際には文字FEで構成される文字列であり、US-ASCIIまたはISO-646文字セットの2バイトが必要です!これら2バイトものでFE あり、値254を有する単一のバイトが何FE を表し印刷表記として、。

通信チャネル、ファイルハンドル、またはそのようなデバイスがバイトストリームを運ぶと説明され、他の情報が提供されない場合、ほとんど確実にバイトが16進テキストとして表されることを意味しないため、ストリーム内の各抽象バイトは2つの物理バイト。

また、生データとは、単に「ビットの配列」を超える構造を持つと解釈されないビットを意味します。通常、生データは構造を持ち、何かを表しますが、生データとして見ると、現時点では解釈を無視しています(たとえば、データ型の生表現を見て、その正確性を検証しています)ビットレベルの詳細まで)、または解釈が利用できません(一部のデータはありますが、データの構造とそれが表すものを理解していません)。


PDP-10には、可変サイズのバイトを処理する命令がありました。最も一般的なのは7ビットASCIIで、その後に6ビット文字が続きました。
ケビンクライン

0

1バイトは8ビットです。ビットは0または1です。「生データ」は、次から次へとバイトが流れるだけです。バイトストリームは、ファイル、ネットワーク接続、シリアル化されたオブジェクト、乱数ジェネレーターなどから取得できます。

  • バイトを表示する方法はいくつかあります:バイナリ(01110110)、16進数= 16進数(7C)、8進数(0271)、ま​​たは10進数(215)。すべての場合で、最大値は255(10を基数)です。

  • ASCIIのように、バイトが文字に割り当てられる場合があります。UNIXコマンドラインで「ascii」と入力すると、バイト値0-255または(0-FF hex)を関連する文字にマップする大きなテーブルが表示されます。たとえば、スペースはx20で、「A」はx40です。一部のバイト値は制御文字にマップされ、印刷できないことに注意してください。しかし、バイト自体は文字ではなく、単なるビットの束です。数。

  • 「リバース4バイト」は、一部のバイト123 42 231 0を取得し、順序を反転します-0 231 42 123。 。

(ところで、byesのように255より大きい数値を表現したい場合は、1バイト以上を使用する必要があるため、問題が関連しています。しかし、問題は、「最大」バイトが最初に来るのか、最後に来るのかですビッグエンディアンまたはリトルエンディアン-生のバイトストリームのバイトをシャッフルすることが有用である理由について、より多くの背景を調べてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.