กระแสข้อมูลไบต์คืออะไรจริง


34

ใครช่วยอธิบายว่า byte stream มีอะไรบ้าง มันมีไบต์ (ข้อมูลฐานสิบหก) หรือข้อมูลไบนารีหรือตัวอักษรภาษาอังกฤษเท่านั้น? ฉันยังสับสนเกี่ยวกับคำว่า "ข้อมูลดิบ" หากมีคนขอให้ฉัน "ย้อนกลับข้อมูล 4 ไบต์" ดังนั้นฉันควรจะถือว่าข้อมูลเป็นรหัสฐานสิบหกหรือรหัสไบนารีหรือไม่


สองเซ็นต์ของฉันไม่ได้คำตอบที่สมควร (และมีคนดีด้านล่างแล้ว) แต่ฉันต้องการให้ลิงก์ไปยังบทความทั้งสองที่อาจให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับวิธีการตีความข้อมูลดิบหมายถึงบางสิ่ง (ไม่ หมายความว่าอะไรนอกจากคุณจะรู้ว่ามันควรจะนำเสนออะไรและมันถูกเข้ารหัส / เก็บไว้อย่างไร) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael

1
ฉันคิดว่า java สร้าง byte เพื่อหลีกเลี่ยงการใช้ถ่านของ c / c ++ สำหรับสิ่งที่ไม่สามารถเข้าใจได้ว่าเป็นตัวละคร ถ่านถูกใช้บ่อยใน c / c ++ เนื่องจากขนาดของถ่านเท่ากับ 1 ไบต์ นอกจากนี้อุปกรณ์ในระบบยูนิกซ์ก็คืออุปกรณ์บล็อคและอักขระ หากคุณอ่านจากอุปกรณ์ถ่านคุณจะได้รับตัวอักษร / ไบต์ที่ไม่ได้ลงชื่อ
imel96

กระแสข้อมูลไบต์ไม่ชัดเจน สตรีมของออคเต็ตไม่ใช่
Deer Hunter

ข้อมูลสามารถตีความได้หลายระดับ ที่ด้านล่างเป็นเพียงชุดของระดับไฟฟ้าเปิด - ปิด บิตที่สูงขึ้นก็เป็นก้อนของไบต์หรือตามที่คุณพูดเป็นกระแส byte ยิ่งสูงขึ้นคุณก็เริ่มตีความข้อมูลดิบ ไบต์สามารถตีความเป็นข้อความได้หลายวิธี (การเข้ารหัส) ตัวเลขจำนวนเต็มเช่นกัน (endian น้อยหรือใหญ่) คุณสามารถสูงขึ้นได้ คุณมีไฟล์ซิป ไฟล์ zip นั้นเป็นข้อมูลสำรองของคุณจากเมื่อวานนี้ และอื่น ๆ ปัญหาคือระดับที่แน่นอนมักจะบอกเป็นนัยและไม่ชัดเจนและอาจทำให้สับสน
nalply

คำตอบ:


52

สตรีมไบต์มีดีไบต์ แบ่งออกเป็นสิ่งที่มันเป็นจริง 8 บิตประกอบด้วย 1s และ 0s ถ้ามันเป็นตัวแทนของตัวเลขก็จะเป็นจำนวนใด ๆ จาก 0 ถึง 255 (ซึ่งฉันอาจเพิ่มเป็นเรื่องบังเอิญไม่ได้ว่าทำไมตัวเลข 4 ในที่อยู่ IP มักจะอยู่ในช่วง 0 ถึง 255) Byte streamเป็นอินเทอร์เฟซที่ซับซ้อนหมายถึงการซ่อน Array Array พื้นฐานพื้นฐานที่ใช้ในการเก็บบัฟเฟอร์แบบวงกลม (คุณเติมบัฟเฟอร์และรอให้ใครบางคนทำการล้างข้อมูลในเวลาที่มันเติมบัฟเฟอร์อีกครั้ง)

ห่านั้นทำหน้าที่อะไร? มันสามารถแสดงไฟล์ข้อความหรือรูปภาพหรือสตรีมวิดีโอสดได้ สิ่งที่มันเป็นทั้งหมดขึ้นอยู่กับบริบทของผู้ที่อ่านมัน การแทนเลขฐานสิบหกเป็นอีกวิธีหนึ่งในการพูดสิ่งเดียวกันแม้ว่าบางครั้งจะสะดวกกว่าในการจัดการไบต์ในแง่ของการแสดงเลขฐานสิบหกของพวกเขามากกว่าตัวเลข แต่มันก็เป็นสิ่งเดียวกัน

เมื่อคุณอ้างถึงข้อมูลดิบคุณมักจะอ้างถึงข้อมูลไบต์ ข้อมูลมาโดยไม่มีแท็กที่บอกว่า "ฉันเป็นไฟล์รูปภาพ!" โดยปกติคุณจะจัดการกับข้อมูลดิบเมื่อคุณไม่สนใจว่าข้อมูลจะแสดงถึงอะไรโดยรวม ตัวอย่างเช่นถ้าฉันต้องการแปลงรูปภาพเป็นรุ่นขาวดำฉันอาจบอกให้อ่านข้อมูลดิบของรูปภาพและอ่านทุก ๆ 3 ไบต์ (ซึ่งจริงๆแล้วจะเป็นตัวแทนของสีแดงเป็นตัวแทนของสีเขียวและเป็นตัวแทนของ สีฟ้า) เพิ่มค่าตัวเลขและหารด้วย 3 แล้วเขียนค่านั้น 3 ครั้ง สิ่งสำคัญที่ฉันจะทำคือการเฉลี่ยค่าพิกเซลสีแดงสีเขียวและสีฟ้าของพิกเซลและทำให้พิกเซลเทียบเท่าสีเทาจากนั้น อย่างไรก็ตามเมื่อคุณพูดคุยเกี่ยวกับการดำเนินการกับข้อมูลในระดับ "byte byte" คุณไม่ต้อง '

หรือบางทีคุณอาจต้องการบันทึกไฟล์ในฐานข้อมูล แต่ขอให้คุณใส่ "ข้อมูลดิบ" ในประเภทข้อมูลหยด นี่หมายถึงการแปลงข้อมูลของไฟล์เป็นอาเรย์ขนาดใหญ่ที่ฐานข้อมูลสามารถเข้าใจและจัดการได้ คุณจะพบว่าเมื่อคุณดึงค่าจากฐานข้อมูลมันจะเป็นเพียงหนึ่งไบต์ขนาดใหญ่ตามที่คุณให้ไว้ในฐานข้อมูลเพื่อเริ่มต้นด้วย หากข้อมูลนั้นเป็นไฟล์ดังนั้นโปรแกรมเมอร์ของคุณจะต้องตีความข้อมูลไบต์นั้นใหม่ราวกับว่าคุณกำลังอ่านไฟล์ทีละหนึ่งไบต์

หากมีคนขอให้คุณ "ย้อนกลับข้อมูล 4 ไบต์" ฉันจะถือว่ามันหมายถึงการตีความตัวเลขขนาดใหญ่และการแปลเล็ก ๆ น้อย ๆ ซึ่งเขียนตัวเลขที่เริ่มต้นด้วยไบต์ที่มีนัยสำคัญมากที่สุดหรือน้อยที่สุด ไม่สำคัญว่าตัวเลขจะถูกแสดงว่าเป็น big-endian หรือ little-endian เพียงแค่ว่าทุกระบบที่อ่านตัวเลขตีความมันอย่างสม่ำเสมอ

นี่ไม่ได้เป็นการบอกว่าการแสดงตัวเลขจริง (หรือการแทนเลขฐานสิบหกสำหรับเรื่องนั้น) มีการเปลี่ยนแปลงเพียงว่าลำดับที่ 4 ไบต์เหล่านี้สร้างตัวเลขควรกลับรายการ สมมติว่าคุณมี 0x01, 0x02, 0x03 และ 0x04 หากต้องการย้อนกลับคุณต้องมี 0x04, 0x03, 0x02, 0x01 แทน ระบบน่าจะอ่าน 4 ไบต์เหล่านี้ในลำดับย้อนกลับและเนื่องจากคุณได้กลับรายการไปแล้วค่าจะถูกตีความว่าเป็นค่าเดียวกันกับที่ตั้งใจไว้ในข้อมูลดิบ

ฉันหวังว่ามันจะอธิบาย!


ทุกอย่างปกติดี ..! คุณช่วยอธิบายรายละเอียดเกี่ยวกับ "ข้อมูลดิบ" ได้หรือไม่?
user2720323

@ user2720323 เอาล่ะแก้ไขเพื่ออธิบายที่ดีกว่า "ข้อมูลดิบ" :)
Neil

สิ่งหนึ่งที่ต้องคำนึงถึง ... ข้อมูลทั้งหมดเป็นเพียงชุดของไบต์ ความหมายของไบต์เหล่านั้นถูกกำหนดโดยเมตาดาต้าบางประเภท (นามสกุลไฟล์, ฐานข้อมูล, ฯลฯ ) ไฟล์รูปภาพสามารถตีความได้ว่าเป็นไฟล์ ASCII และในทางกลับกัน ข้อความหรือรูปภาพอาจไม่มีความหมาย แต่ก็ยังเป็นไปได้ (Derp ... ฉันควรจะได้อ่านคำตอบต่อไป)
เดฟ Nay

2
@ kevincline โปรดลองชื่นชมความจริงที่ว่าฉันพยายามถ่ายทอดความคิด ลำดับความสำคัญของฉันไม่ได้เป็นการเขียนอัลกอริทึมที่ถูกต้อง หากคุณต้องการความแม่นยำมากขึ้นคุณจะต้องชั่งค่าสีแดงสีเขียวและสีน้ำเงินตามสิ่งที่สายตามนุษย์สามารถรับรู้ได้
Neil

18

ไบต์เป็นเพียงหน่วยของข้อมูล - มันสามารถเป็นอะไรก็ได้ ไบต์โดยตัวมันเองไม่ได้มีความหมายอะไรเลยคุณต้องแนบความหมายบางอย่างกับมัน

ดังนั้นเพื่อขยายที่ -

มันมีไบต์ (ข้อมูลฐานสิบหก) หรือข้อมูลไบนารีหรือตัวอักษรภาษาอังกฤษเท่านั้น?

ข้อมูล Hex เหมือนกันกับข้อมูลไบนารี มันเป็นวิธีที่แตกต่างในการแสดงข้อมูล ตัวอย่างเช่น 0x41 = 0b01000001 = 'A' = 65 (ทศนิยม) ตัวอักษรภาษาอังกฤษจะเป็นเพียงส่วนหนึ่งของสิ่งนั้น

หากมีคนขอให้ฉัน "ย้อนกลับข้อมูล 4 ไบต์" ดังนั้นฉันควรจะถือว่าข้อมูลเป็นรหัสฐานสิบหกหรือรหัสไบนารีหรือไม่

เนื่องจาก hex เป็นเพียง a แสดงข้อมูลจึงไม่สำคัญว่าคุณจะคิดอย่างไร หากคุณมีข้อมูลที่จะย้อนกลับมันคุณจะได้รับ0x65 0x66 0x67 0x68 0x68 0x67 0x66 0x65หากคุณกำลังมองหาข้อมูลนี้ในแง่ของตัวละครคุณเดิมจะมีแต่ตอนนี้คุณมีA B C DD C B A

กลับไปที่กระแสไบต์ - มันเป็นเพียงลำดับของข้อมูล คุณจำเป็นต้องรู้ว่าข้อมูลหมายถึงอะไรเพื่อที่จะใช้ หากเรากำลังอ่านไฟล์ข้อความสตรีมไบต์ที่คุณจะได้รับเมื่อคุณอ่านไฟล์จะเป็นตัวอักษรบางชนิด ไฟล์ที่ปฏิบัติการได้จะมีกลุ่มของอักขระที่ไม่สามารถพิมพ์ได้ซึ่งเป็นสาเหตุที่มันถูกเรียกว่าไบนารีไฟล์เห็นได้ชัดว่ามันเป็นไปได้ที่จะเปิดไฟล์ปฏิบัติการในโปรแกรมแก้ไขข้อความ แต่มันไม่ได้มีประโยชน์อะไรเลย


1
+1 แต่เน้นไบนารีใน lat บิตดูเหมือนว่าถูกวางผิดที่ "ข้อมูลไบนารี" มักประกอบด้วยอักขระที่ไม่สามารถพิมพ์ได้ แต่มันถูกเรียกว่า "ไบนารี" เนื่องจากประกอบด้วยเลขฐานสองไม่ใช่เพราะมีอักขระที่ไม่สามารถพิมพ์ได้ ฉันเข้าใจว่าคุณกำลังใช้ "เลขฐานสอง" ตรงข้ามกับข้อมูล "ข้อความ" ที่พิมพ์ได้ แต่ฉันคิดว่านี่อาจทำให้ OP สับสนมากขึ้น
Caleb

ฉันมีคำถามหนึ่งข้อเกี่ยวกับการกลับรายการ .. หากฉันมีจำนวนเต็ม (32 บิต) 325487 ในไฟล์ฉันจะย้อนกลับจำนวนเต็ม 4 ไบต์นี้ได้อย่างไร ในทำนองเดียวกันฉันมีคำ ("คุณเป็นอย่างไรบ้าง") วิธีการย้อนกลับสตริงนี้โดยสมมติว่าตัวละครทุกตัวเป็นไบต์
user2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); วิธีนี้ใช้เวลาแต่ละไบต์เลื่อนในตำแหน่งที่ถูกต้องและรวมเข้ากับที่อื่น
Neil

2

สตรีมไบต์เป็นลำดับไบต์ มีไบต์แรกซึ่งไม่มีรุ่นก่อน ตัวตายตัวแทนของมันคือไบต์ที่สองเป็นต้น ทุกวันนี้ไบต์มีความเข้าใจกันอย่างกว้างขวางว่าประกอบด้วยแปดบิต หากเราต้องการความแม่นยำมากขึ้นเราจะใช้คำว่าoctet streamและoctet ยังมีคอมพิวเตอร์ที่มีไบต์ที่ไม่กว้างแปดบิตอยู่

เลขฐานสิบหกเป็นวิธีการเขียนตัวเลขและทำหน้าที่เป็นตัวแทนพิมพ์สำหรับข้อมูลไบนารี เลขฐานสิบหกเป็นข้อความจริง ยกตัวอย่างเช่นค่าฐานสิบหกFEอาจเป็นตัวแทนของไบต์: บิตซึ่งมีมูลค่าทศนิยม11111110 255อย่างไรก็ตามFEจริง ๆ แล้วเป็นสตริงอักขระที่ประกอบด้วยอักขระFและEต้องใช้สองไบต์ในชุดอักขระ US-ASCII หรือ ISO-646! ทั้งสองไบต์คือสิ่งที่FE เป็นและ byte เดียวที่มีมูลค่า 254 คือสิ่งที่FE แสดงให้เห็นถึงเป็นสัญกรณ์พิมพ์

หากช่องทางการสื่อสารหรือตัวจัดการไฟล์หรืออุปกรณ์ดังกล่าวอธิบายว่ามีกระแสข้อมูลไบต์และไม่มีการให้ข้อมูลอื่น ๆ ได้หมายความว่าไบต์จะถูกแทนด้วยข้อความเลขฐานสิบหกเพื่อให้แต่ละไบต์บทคัดย่อในสตรีมต้องการ สองฟิสิคัลไบต์

และข้อมูลดิบก็หมายถึงบิตที่ไม่ได้ตีความว่ามีโครงสร้างใด ๆ เกินกว่า "อาเรย์ของบิต" ข้อมูลดิบมักจะมีโครงสร้างและแสดงถึงบางสิ่ง แต่เมื่อเรามองว่าเป็นข้อมูลดิบเราจะเพิกเฉยต่อการตีความในขณะนี้ (ตัวอย่างเช่นเรากำลังดูการแสดงข้อมูลดิบของชนิดข้อมูลเพื่อตรวจสอบความถูกต้องของข้อมูล ไปยังรายละเอียดระดับบิต) หรือการตีความไม่พร้อมใช้งาน (เรามีข้อมูลบางอย่าง แต่เราไม่เข้าใจโครงสร้างของข้อมูลและสิ่งที่มันหมายถึง)


PDP-10 มีคำแนะนำในการจัดการกับไบต์ของขนาดตัวแปร ที่พบมากที่สุดคือ ASCII เจ็ดบิตตามด้วยอักขระหกบิต
วินไคลน์

0

ไบต์คือ 8 บิต บิตคือ 0 หรือ 1 "ข้อมูลดิบ" เป็นเพียงการไหลของหนึ่งไบต์หลังจากที่อื่น สตรีมไบต์สามารถมาจากไฟล์การเชื่อมต่อเครือข่ายวัตถุที่ต่อเนื่องเครื่องกำเนิดหมายเลขสุ่มเป็นต้น

  • มีหลายวิธีในการแสดงไบต์: binary (01110110), hex = hexidecimal (7C), octal (0271) หรือทศนิยม (215) ในทุกกรณีค่าสูงสุดคือ 255 (ฐาน 10)

  • บางครั้งไบต์ถูกกำหนดให้กับตัวละครเช่น ascii พิมพ์ "ascii" บนบรรทัดคำสั่ง unix และคุณจะได้รับตารางขนาดใหญ่ที่แมปค่า valte 0-255 หรือ (0-FF hex) กับอักขระที่เกี่ยวข้อง ตัวอย่างเช่นช่องว่างคือ x20 และ "A" คือ x40 โปรดทราบว่าบางค่าไบต์จับคู่กับอักขระและไม่สามารถพิมพ์ได้ แต่ตัวไบต์เองไม่ใช่ตัวอักษรพวกมันเป็นเพียงบิตมัด หมายเลข.

  • "reverse 4 bytes" จะต้องใช้บางไบต์ 123 42 231 0 และพลิกคำสั่ง - 0 231 42 123 นำไปใช้กับ byte steam ฉันอาจจะอ่าน 4 bytes, reverse พวกเขาอ่าน 4 bytes ต่อไปเป็นต้น .

(BTW ปัญหานั้นมีความเกี่ยวข้องเพราะถ้าคุณต้องการแสดงจำนวนที่มากกว่า 255 เป็น byes คุณต้องใช้มากกว่าหนึ่ง byte แต่แล้วคำถามคือ byte "ที่ใหญ่ที่สุด" มาก่อนหรือสุดท้ายนั่นเรียกว่า big endian หรือ endian เล็ก ๆ น้อย ๆ - มองหาพื้นหลังเหล่านี้เพื่อดูว่าทำไมจึงมีประโยชน์ในการสับเปลี่ยนไบต์ในสตรีมไบต์แบบดิบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.