Apa itu stream byte sebenarnya?

34

Adakah yang bisa menjelaskan kepada saya apa byte stream sebenarnya mengandung? Apakah hanya berisi byte (data hex) atau data biner atau huruf bahasa Inggris saja? Saya juga bingung tentang istilah "data mentah". Jika seseorang meminta saya untuk "membalikkan data 4 byte", lalu apa yang harus saya asumsikan bahwa data tersebut adalah kode hex atau kode biner?

pengguna2720323
sumber
Dua sen saya bukan jawaban yang layak (dan sudah ada yang bagus di bawah) tetapi saya hanya ingin memberikan tautan ke 2 artikel ini yang mungkin akan memberikan wawasan yang baik tentang bagaimana "data mentah" ditafsirkan untuk benar-benar berarti sesuatu (tidak berarti apa-apa kecuali Anda tahu apa yang seharusnya diwakilkan dan bagaimana itu dikodekan / disimpan) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael
1
Saya pikir java dibuat byte untuk menghindari penggunaan char c / c ++ untuk hal-hal yang tidak dapat dipahami sebagai karakter. char banyak digunakan di c / c ++ karena ukuran char adalah 1 byte. Juga perangkat di unix adalah perangkat blok dan karakter. Jika Anda membaca dari perangkat char, Anda mendapatkan aliran karakter / byte yang tidak ditandatangani.
imel96
Byte stream bersifat mendua. Streaming oktet tidak.
Deer Hunter
Data dapat diinterpretasikan pada banyak tingkatan. Di bagian bawah itu hanya serangkaian tingkat listrik on-off. Sedikit lebih tinggi, itu adalah byte byte, atau seperti yang Anda katakan, aliran byte . Bahkan lebih tinggi Anda mulai menafsirkan data mentah. Bytes dapat diartikan sebagai teks dalam banyak cara (penyandian). Angka integer juga (endian besar atau kecil). Anda bahkan bisa naik lebih tinggi. Anda memiliki file zip. File zip itu adalah cadangan Anda dari kemarin. Dan seterusnya. Masalahnya adalah bahwa level yang tepat sering implisit dan tidak dibuat jelas, dan ini bisa membingungkan.
nalply

Jawaban:

52

Byte stream berisi, yah, byte. Dipecah menjadi apa sebenarnya, itu adalah 8 bit yang terdiri dari 1s dan 0s. Jika itu mewakili angka, itu akan berupa angka dari 0 hingga 255 (yang, saya dapat tambahkan, bukan kebetulan mengapa 4 angka dalam alamat IP selalu berkisar dari 0 hingga 255). Byte stream biasanya antarmuka canggih yang dimaksudkan untuk menyembunyikan array byte dasar yang digunakan untuk menahan buffer lingkaran (Anda mengisi buffer dan menunggu seseorang untuk mengosongkannya, pada saat itu hanya mengisi buffer lagi).

Apa sih yang dilambangkannya? Ya, itu bisa mewakili file teks, atau gambar, atau streaming video langsung. Apa itu adalah sepenuhnya tergantung pada konteks yang membacanya. Representasi hex adalah cara lain untuk mengatakan hal yang sama, meskipun terkadang lebih mudah untuk mengelola byte dalam hal representasi hex mereka daripada angka tetapi itu adalah hal yang sama.

Saat Anda merujuk ke data mentah, Anda biasanya merujuk ke data byte. Data datang tanpa tag yang mengatakan "Saya file gambar!" Biasanya Anda hanya berurusan dengan data mentah ketika Anda tidak benar-benar peduli apa yang mewakili data secara keseluruhan. Misalnya, jika saya ingin mengonversi gambar ke versi hitam dan putih, saya dapat mengatakan untuk membaca data mentah gambar dan untuk setiap 3 byte bacaan (yang sebenarnya merupakan representasi warna merah, representasi warna hijau, dan representasi warna biru), tambahkan nilai angka dan bagi dengan 3, kemudian tulis nilai itu 3 kali. Pada dasarnya apa yang akan saya lakukan adalah rata-rata nilai-nilai piksel merah, hijau, dan biru dan membuat piksel setara abu-abu dari itu. Namun, ketika Anda berbicara tentang melakukan operasi ke data pada tingkat "byte demi byte", Anda tidak perlu

Atau, mungkin Anda ingin menyimpan file dalam database, tetapi ia meminta Anda untuk memasukkan "data mentah" dalam tipe data gumpalan. Ini hanya berarti mengubah data file menjadi array byte besar yang dapat dipahami dan dikelola oleh database. Anda akan menemukan bahwa ketika Anda mengambil nilai itu dari database, itu hanya akan menjadi satu array byte besar seperti yang Anda berikan pada database untuk memulai. Jika data itu adalah file, maka Anda, programmer, harus menafsirkan ulang data byte itu seolah-olah Anda membaca file satu byte pada suatu waktu.

Jika seseorang meminta Anda untuk "membalikkan data 4 byte", saya akan menganggap itu mengacu pada interpretasi angka big-endian vs little-endian, yang menulis angka dimulai dengan byte yang paling atau paling signifikan. Tidak masalah jika suatu angka direpresentasikan sebagai big-endian atau little-endian, hanya saja semua sistem yang membaca angka menafsirkannya secara konsisten.

Ini bukan untuk mengatakan bahwa representasi angka aktual (atau representasi hex dalam hal ini) diubah, hanya bahwa urutan 4 byte ini membuat angka harus dibalik. Jadi katakan Anda memiliki 0x01, 0x02, 0x03, dan 0x04. Untuk membalikkan ini, Anda akan memiliki 0x04, 0x03, 0x02, 0x01 sebagai gantinya. Sistem mungkin akan membaca 4 byte ini dalam urutan terbalik dan karena Anda sudah membalikkannya, nilainya ditafsirkan sama seperti apa yang dimaksudkan dalam data mentah.

Saya harap itu menjelaskannya!

Neil
sumber
Semuanya baik-baik saja ..! Bisakah Anda jelaskan jawaban yang menjelaskan "data mentah"?
user2720323
@ user2720323 Oke, dimodifikasi untuk menjelaskan "data mentah" yang lebih baik. :)
Neil
Satu hal yang perlu diingat ... semua data hanyalah kumpulan byte. Arti dari byte tersebut didefinisikan oleh semacam metadata (ekstensi file, bidang basis data, dll). File gambar dapat diartikan sebagai file ASCII dan sebaliknya. Teks atau gambar mungkin tidak ada artinya, tetapi masih mungkin. (Derp ... Seharusnya saya membaca jawaban berikutnya)
Dave Nay
2
@kevincline Tolong coba untuk menghargai fakta bahwa saya mencoba menyampaikan ide. Prioritas saya bukan menulis algoritma yang akurat. Jika Anda ingin lebih akurat, Anda akan menimbang nilai merah hijau dan biru sesuai dengan apa yang bisa dilihat mata manusia.
Neil
18

Satu byte hanyalah sebuah unit informasi - bisa berupa apa saja. Byte itu sendiri tidak berarti apa-apa, Anda harus melampirkan semacam makna padanya.

Jadi, untuk memperluas itu -

Apakah hanya berisi byte (data hex) atau data biner atau huruf bahasa Inggris saja?

Data heks sama dengan data biner. Itu hanya cara berbeda untuk menampilkan data. Misalnya, 0x41 = 0b01000001 = 'A' = 65 (desimal). Huruf-huruf bahasa Inggris hanyalah sebagian saja.

Jika seseorang meminta saya untuk "membalikkan data 4 byte", lalu apa yang harus saya asumsikan bahwa data tersebut adalah kode hex atau kode biner?

Karena hex hanyalah representasi dari data, tidak masalah bagaimana Anda memikirkannya. Jika Anda memiliki data 0x65 0x66 0x67 0x68, untuk membalikkannya Anda akan mendapatkan 0x68 0x67 0x66 0x65. Jika Anda melihat data ini dari segi karakter, Anda awalnya akan memiliki A B C D, tetapi sekarang Anda miliki D C B A.

Kembali ke aliran byte - itu hanya urutan data. Anda harus tahu data yang diwakilkan untuk menggunakannya. Jika kita membaca file teks, aliran byte yang akan Anda dapatkan ketika Anda membaca file itu hanya berupa karakter. File yang dapat dieksekusi akan memiliki banyak karakter yang tidak dapat dicetak di dalamnya, itulah sebabnya itu akan disebut file biner . Jelas, itu mungkin untuk membuka sebuah executable di editor teks, tetapi tidak ada gunanya.

rm5248
sumber
1
+1 tetapi penekanan pada biner di bit lat tampaknya salah tempat. "data biner" sering mengandung karakter yang tidak patut, tetapi disebut "biner" karena terdiri dari angka biner, bukan karena mengandung karakter yang tidak patut. Saya mengerti bahwa Anda menggunakan "biner" sebagai lawan dari data "teks" yang dapat dicetak, tetapi saya pikir ini dapat membingungkan OP lebih jauh.
Caleb
Saya memiliki satu pertanyaan tentang pembalikan .. Jika saya memiliki integer (32 bit) 325487 dalam file bagaimana saya bisa membalikkan integer 4 byte ini? sama saya punya kata ("hai apa kabar"), cara membalikkan string ini dengan menganggap setiap karakter sebagai byte.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Ini benar-benar mengambil setiap byte, menggesernya di posisi yang tepat, dan menggabungkan dengan yang lain.
Neil
2

Aliran byte adalah urutan byte yang dipesan. Ada byte pertama, yang tidak memiliki pendahulu. Penggantinya adalah byte kedua, dan seterusnya. Saat ini, byte secara luas dipahami terdiri dari delapan bit. Jika kita ingin lebih tepat, kita menggunakan istilah aliran oktet dan oktet . Masih ada komputer dengan byte yang tidak lebar delapan bit.

Heksadesimal adalah cara penulisan angka, dan berfungsi sebagai representasi cetak untuk data biner. Heksadesimal sebenarnya adalah teks. Misalnya, nilai heksadesimal FEmungkin mewakili byte: bit 11111110yang memiliki nilai desimal 255. Namun FEsebenarnya string karakter terdiri dari karakter Fdan E, yang membutuhkan dua byte di set karakter US-ASCII atau ISO-646! Dua byte ini adalah apa FE adanya , dan byte tunggal dengan nilai 254 adalah apa yang FE diwakilinya , sebagai notasi cetak.

Jika saluran komunikasi, atau file handle atau perangkat semacam itu digambarkan membawa aliran byte, dan tidak ada informasi lain yang diberikan, itu hampir pasti tidak berarti bahwa byte direpresentasikan sebagai teks heksadesimal, sehingga setiap byte abstrak dalam aliran memerlukan dua byte fisik.

Dan data mentah berarti bit yang tidak diartikan memiliki struktur apa pun di luar "array bit". Data mentah biasanya memiliki struktur dan mewakili sesuatu, tetapi ketika kita melihatnya sebagai data mentah, kita mengabaikan interpretasi untuk saat ini (misalnya, kita melihat representasi mentah dari tipe data untuk memverifikasi kebenarannya. ke detail level bit), atau interpretasi tidak tersedia (kami memiliki beberapa data, tetapi kami tidak memahami struktur data dan apa yang diwakilinya).

Kaz
sumber
PDP-10 memiliki instruksi untuk menangani byte dengan ukuran variabel. Yang paling umum adalah ASCII tujuh bit, diikuti oleh karakter enam-bit.
kevin cline
0

Satu byte adalah 8 bit. Bit adalah 0 atau 1. "Data mentah" hanya aliran satu byte demi satu. Aliran byte dapat berasal dari file, koneksi jaringan, objek serial, generator nomor acak, dll.

  • Ada beberapa cara untuk menampilkan byte: biner (01110110), hex = hexidecimal (7C), oktal (0271), atau desimal (215). Dalam semua kasus, nilai maksimum adalah 255 (basis 10).

  • Terkadang byte ditugaskan untuk karakter, seperti ascii. Ketik "ascii" pada baris perintah unix, dan Anda akan mendapatkan tabel besar yang memetakan byte byte 0-255 atau (hex 0-FF) ke karakter terkait. Misalnya, ruang adalah x20 dan "A" adalah x40. Perhatikan bahwa beberapa nilai byte memetakan untuk mengontrol karakter dan tidak dapat dicetak. Tapi byte itu sendiri bukan karakter - mereka hanya setumpuk bit. Sebuah angka.

  • "membalikkan 4 byte" akan mengambil beberapa byte 123 42 231 0 dan membalik urutan - 0 231 42 123. Diterapkan ke byte uap, saya mungkin akan membaca 4 byte, balikkan, baca 4 byte berikutnya, dll .

(BTW masalah itu relevan, karena jika Anda ingin merepresentasikan angka yang lebih besar dari 255 sebagai bye, Anda perlu menggunakan lebih dari satu byte. Tetapi kemudian pertanyaannya adalah, apakah byte "terbesar" datang pertama, atau terakhir? Itu disebut big endian atau little endian - cari yang lebih banyak latar belakang tentang mengapa berguna untuk mengacak byte dalam stream byte mentah.)

rampok
sumber