Một luồng byte thực sự là gì?


34

Bất cứ ai có thể giải thích cho tôi những luồng byte thực sự chứa? Nó có chứa byte (dữ liệu hex) hoặc dữ liệu nhị phân hoặc chữ cái tiếng Anh không? Tôi cũng bối rối về thuật ngữ "dữ liệu thô". Nếu ai đó yêu cầu tôi "đảo ngược dữ liệu 4 byte", thì tôi nên giả sử dữ liệu là mã hex hay mã nhị phân?


Hai xu của tôi không trả lời xứng đáng (và đã có những câu hỏi hay bên dưới) nhưng tôi chỉ muốn cung cấp liên kết đến 2 bài viết này có thể sẽ cung cấp cái nhìn sâu sắc về cách "dữ liệu thô" được hiểu là thực sự có ý nghĩa gì đó (nó không có nghĩa là bất cứ điều gì trừ khi bạn biết những gì nó được cho là đại diện và cách mã hóa / lưu trữ) betterexplained.com/articles/iêu joelonsoftware.com/articles/Unicode.html
Michael

1
Tôi nghĩ java đã tạo byte để tránh sử dụng char của c / c ++ cho những thứ không thể hiểu là ký tự. char đã được sử dụng rất nhiều trong c / c ++ vì kích thước của char là 1 byte. Ngoài ra các thiết bị trong unix là các thiết bị khối và ký tự. Nếu bạn đọc từ các thiết bị char, bạn sẽ nhận được luồng ký tự / byte không dấu.
imel96

Luồng Byte là mơ hồ. Dòng Octet thì không.
Deer Hunter

Dữ liệu có thể được giải thích trên nhiều cấp độ. Ở phía dưới, nó chỉ là một loạt các mức điện bật tắt. Cao hơn một chút, đó là một đoạn byte, hoặc như bạn nói, một luồng byte . Thậm chí cao hơn bạn bắt đầu giải thích dữ liệu thô. Byte có thể được hiểu là văn bản theo nhiều cách (mã hóa). Số nguyên cũng vậy, (endian lớn hay nhỏ). Bạn thậm chí có thể đi lên cao hơn. Bạn có một tệp zip. Tệp zip đó là bản sao lưu của bạn từ ngày hôm qua. Và như vậy. Vấn đề là mức độ chính xác thường ẩn và không được làm rõ, và điều này có thể gây nhầm lẫn.
nalply

Câu trả lời:


52

Các luồng byte chứa, tốt, byte. Được chia nhỏ thành những gì nó thực sự, nó là 8 bit bao gồm 1 và 0. Nếu nó đại diện cho một số, nó sẽ là bất kỳ số nào từ 0 đến 255 (mà tôi có thể thêm vào, không phải ngẫu nhiên tại sao 4 số trong một địa chỉ IP luôn nằm trong khoảng từ 0 đến 255). Các luồng byte thường là các giao diện tinh vi nhằm ẩn mảng byte cơ bản bên dưới được sử dụng để giữ bộ đệm tròn (bạn điền vào bộ đệm và đợi ai đó làm trống nó, tại thời điểm đó, nó chỉ đơn giản là lấp đầy bộ đệm lại).

Cái quái gì thể hiện? Chà, nó có thể đại diện cho một tệp văn bản, hoặc một hình ảnh hoặc một luồng video trực tiếp. Những gì nó hoàn toàn phụ thuộc vào bối cảnh của những người đang đọc nó. Biểu diễn hex là một cách khác để nói điều tương tự, mặc dù đôi khi thuận tiện hơn để quản lý byte theo cách biểu diễn hex của chúng hơn là số tuy nhiên đó là điều tương tự.

Khi bạn đang đề cập đến dữ liệu thô, bạn thường đề cập đến dữ liệu byte. Dữ liệu đi kèm mà không có thẻ ghi "Tôi là tệp hình ảnh!" Thông thường, bạn chỉ xử lý dữ liệu thô khi bạn không thực sự quan tâm dữ liệu đại diện cho cái gì. Ví dụ: nếu tôi muốn chuyển đổi hình ảnh sang phiên bản đen trắng của nó, tôi có thể nói là đọc dữ liệu thô của hình ảnh và cứ sau 3 byte đọc (thực sự sẽ là đại diện cho màu đỏ, đại diện cho màu xanh lục và đại diện cho màu xanh lam), thêm giá trị số của nó và chia cho 3, sau đó viết giá trị đó 3 lần. Về cơ bản những gì tôi đang làm là lấy trung bình các giá trị đỏ, lục và lam của pixel và tạo pixel tương đương màu xám của nó từ đó. Tuy nhiên, khi bạn nói về việc thực hiện các thao tác với dữ liệu ở mức "byte theo byte", bạn không '

Hoặc, có lẽ bạn muốn lưu tệp trong cơ sở dữ liệu, nhưng nó yêu cầu bạn chèn "dữ liệu thô" của nó vào loại dữ liệu blob. Điều này chỉ có nghĩa là chuyển đổi dữ liệu của tệp thành một mảng byte lớn mà cơ sở dữ liệu có thể hiểu và quản lý. Bạn sẽ thấy rằng khi bạn truy xuất giá trị đó từ cơ sở dữ liệu, nó sẽ chỉ đơn giản là một mảng byte lớn như ban đầu bạn đã cung cấp cho cơ sở dữ liệu. Nếu dữ liệu đó là một tệp, thì bạn, lập trình viên, phải diễn giải lại dữ liệu byte đó như thể bạn đang đọc một tệp một byte mỗi lần.

Nếu ai đó yêu cầu bạn "đảo ngược dữ liệu 4 byte", tôi sẽ cho rằng nó đề cập đến việc giải thích các số lớn về cuối và cuối số, viết các số bắt đầu bằng byte nhiều nhất hoặc ít quan trọng nhất. Không có vấn đề gì nếu một số được biểu diễn dưới dạng cuối lớn hoặc cuối nhỏ, chỉ là tất cả các hệ thống đọc số đó đều giải thích nó một cách nhất quán.

Điều này không có nghĩa là đại diện số thực tế (hoặc biểu diễn hex cho vấn đề đó) đã bị thay đổi, chỉ đơn giản là thứ tự trong đó 4 byte tạo ra một số phải được đảo ngược. Vì vậy, giả sử bạn có 0x01, 0x02, 0x03 và 0x04. Để đảo ngược những điều này, bạn sẽ có 0x04, 0x03, 0x02, 0x01 thay thế. Hệ thống có lẽ sẽ đọc 4 byte này theo thứ tự ngược lại và vì bạn đã đảo ngược nó, giá trị được hiểu là giống như những gì được dự định trong dữ liệu thô.

Tôi hy vọng điều đó giải thích nó!


Mọi thứ đều ổn ..! Bạn có thể vui lòng xây dựng câu trả lời kiểm tra lại "dữ liệu thô" không?
dùng2720323

@ user2720323 Được rồi, sửa đổi để giải thích "dữ liệu thô" tốt hơn. :)
Neil

Một điều cần lưu ý ... tất cả dữ liệu chỉ đơn giản là một tập hợp các byte. Ý nghĩa của các byte đó được xác định bởi một số loại siêu dữ liệu (phần mở rộng tệp, trường cơ sở dữ liệu, v.v.). Một tệp hình ảnh có thể được hiểu là một tệp ASCII và ngược lại. Văn bản hoặc hình ảnh có thể là vô nghĩa, nhưng nó vẫn có thể. (Derp ... Tôi nên đọc câu trả lời tiếp theo)
Dave Nay

2
@kevincline Hãy cố gắng đánh giá cao sự thật rằng tôi đang cố gắng truyền đạt một ý tưởng. Ưu tiên của tôi không phải là viết một thuật toán chính xác. Nếu bạn muốn chính xác hơn, bạn sẽ cân nhắc các giá trị xanh đỏ và xanh lam theo những gì mắt người có thể cảm nhận được.
Neil

18

Một byte chỉ đơn giản là một đơn vị thông tin - nó có thể là bất cứ thứ gì. Bản thân một byte không có nghĩa gì cả, bạn phải đính kèm một số ý nghĩa với nó.

Vì vậy, để mở rộng về điều đó -

Nó có chứa byte (dữ liệu hex) hoặc dữ liệu nhị phân hoặc chữ cái tiếng Anh không?

Dữ liệu hex giống như dữ liệu nhị phân. Đó chỉ là một cách khác nhau để hiển thị dữ liệu. Ví dụ: 0x41 = 0b01000001 = 'A' = 65 (thập phân). Chữ cái tiếng Anh sẽ chỉ là một tập hợp con của điều đó.

Nếu ai đó yêu cầu tôi "đảo ngược dữ liệu 4 byte", thì tôi nên giả sử dữ liệu là mã hex hay mã nhị phân?

Vì hex chỉ là một đại diện của dữ liệu, nên bạn nghĩ về nó như thế nào không quan trọng. Nếu bạn có dữ liệu 0x65 0x66 0x67 0x68, để đảo ngược nó, bạn sẽ nhận được 0x68 0x67 0x66 0x65. Nếu bạn đang xem dữ liệu này về các ký tự, ban đầu bạn sẽ có A B C D, nhưng bây giờ bạn có D C B A.

Quay lại luồng byte - đó chỉ là một chuỗi dữ liệu. Bạn cần biết những gì dữ liệu đại diện để sử dụng nó. Nếu chúng ta đang đọc một tệp văn bản, luồng byte mà bạn sẽ nhận được khi bạn đọc tệp sẽ chỉ là một loại ký tự. Một tệp thực thi sẽ có một loạt các ký tự không thể in được, đó là lý do tại sao nó sẽ được gọi là tệp nhị phân . Rõ ràng, có thể mở một tệp thực thi trong trình soạn thảo văn bản, nhưng nó không làm được gì hữu ích.


1
+1 nhưng sự nhấn mạnh vào nhị phân trong bit lat dường như bị đặt sai chỗ. "Dữ liệu nhị phân" thường không chứa các ký tự không thể in được, nhưng nó được gọi là "nhị phân" vì nó được tạo thành từ các chữ số nhị phân, không phải vì nó chứa các ký tự không thể in được. Tôi hiểu rằng bạn đang sử dụng "nhị phân" đối lập với dữ liệu "văn bản" có thể in được, nhưng tôi nghĩ điều này có thể khiến OP nhầm lẫn hơn nữa.
Caleb

Tôi có một câu hỏi liên quan đến đảo ngược .. Nếu tôi có một số nguyên (32 bit) 325487 trong một tệp, làm thế nào tôi có thể đảo ngược số nguyên 4 byte này? tương tự tôi có một từ ("hai bạn khỏe không"), làm thế nào để đảo ngược chuỗi này bằng cách giả sử mỗi ký tự là một byte.
dùng2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Điều này thực sự mất từng byte, dịch chuyển nó vào đúng vị trí và kết hợp với các byte khác.
Neil

2

Một luồng byte là một chuỗi byte được sắp xếp. Có một byte đầu tiên, không có tiền thân. Kế của nó là byte thứ hai, v.v. Ngày nay, một byte được hiểu rộng rãi bao gồm tám bit. Nếu chúng ta muốn chính xác hơn, chúng ta sử dụng thuật ngữ octet streamoctet . Vẫn còn tồn tại các máy tính có byte không rộng tám bit.

Hệ thập lục phân là cách viết số và đóng vai trò là biểu diễn in cho dữ liệu nhị phân. Hệ thập lục phân thực sự là văn bản. Chẳng hạn, giá trị thập lục phân FEcó thể biểu thị một byte: các bit 11111110có giá trị thập phân 255. Tuy nhiên, FEthực sự là một chuỗi ký tự bao gồm các ký tự FE, yêu cầu hai byte trong bộ ký tự US-ASCII hoặc ISO-646! Hai byte là những gì FE , và byte duy nhất với giá trị 254 là những gì mà FE đại diện , như một ký hiệu được in ra.

Nếu một kênh truyền thông, hoặc xử lý tệp hoặc một số thiết bị như vậy được mô tả là mang luồng byte và không có thông tin nào khác được cung cấp, thì gần như chắc chắn không có nghĩa là các byte được biểu diễn dưới dạng văn bản thập lục phân, do đó mỗi byte trừu tượng trong luồng yêu cầu hai byte vật lý.

Và dữ liệu thô chỉ đơn giản là các bit không được hiểu là có bất kỳ cấu trúc nào ngoài "mảng bit". Dữ liệu thô thường có cấu trúc và đại diện cho một cái gì đó, nhưng khi chúng ta xem nó là dữ liệu thô, chúng ta sẽ bỏ qua việc giải thích cho hiện tại (ví dụ, chúng ta đang xem xét biểu diễn thô của một loại dữ liệu để xác minh tính chính xác của nó đến chi tiết mức bit), hoặc giải thích không có sẵn (chúng tôi có một số dữ liệu, nhưng chúng tôi không hiểu cấu trúc của dữ liệu và những gì nó đại diện).


PDP-10 có các hướng dẫn để xử lý các byte có kích thước thay đổi. Phổ biến nhất là ASCII bảy bit, tiếp theo là các ký tự sáu bit.
kevin cline

0

Một byte là 8 bit. Một bit là 0 hoặc 1. "Dữ liệu thô" chỉ là một luồng của một byte sau một byte khác. Một luồng byte có thể đến từ một tệp, kết nối mạng, đối tượng được tuần tự hóa, trình tạo số ngẫu nhiên, v.v.

  • Có một số cách để hiển thị một byte: binary (01110110), hex = hexidecimal (7C), bát phân (0271) hoặc thập phân (215). Trong mọi trường hợp, giá trị tối đa là 255 (cơ sở 10).

  • Đôi khi các byte được gán cho các ký tự, như ascii. Nhập "ascii" trên một dòng lệnh unix và bạn sẽ nhận được một bảng lớn ánh xạ các giá trị byte 0-255 hoặc (hex 0-FF) cho ký tự được liên kết. Ví dụ: không gian là x20 và "A" là x40. Lưu ý rằng một số giá trị byte ánh xạ để điều khiển các ký tự và không thể in được. Nhưng bản thân các byte không phải là ký tự - chúng chỉ là một bó bit. Một số.

  • "Đảo ngược 4 byte" sẽ lấy một số byte 123 42 231 0 và lật thứ tự - 0 231 42 123. Áp dụng cho hơi byte, tôi có thể đọc 4 byte, đảo ngược chúng, đọc 4 byte tiếp theo, v.v. .

(BTW vấn đề đó có liên quan, bởi vì nếu bạn muốn đại diện cho một số lớn hơn 255 là tạm biệt, bạn cần sử dụng nhiều hơn một byte. Nhưng câu hỏi đặt ra là, byte "lớn nhất" sẽ đến trước hay cuối cùng? endian lớn hoặc endian nhỏ - tìm kiếm những thông tin cơ bản hơn về lý do tại sao việc xáo trộn xung quanh các byte trong luồng byte thô lại hữu ích.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.