字节流实际上是什么?


34

谁能解释我实际上包含什么字节流?它仅包含字节(十六进制数据)或二进制数据还是英文字母?我对“原始数据”一词也感到困惑。如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?


我的两分钱没有得到应有的答复(下面已经有不错的答案了),但我只想提供指向这两篇文章的链接,这些链接可能会提供关于“原始数据”如何被解释为实际含义的深刻见解(不是意味着什么,除非你知道什么是应该表示和它是如何编码/存储)betterexplained.com/articles/... joelonsoftware.com/articles/Unicode.html
迈克尔

1
我认为Java创建字节是为了避免将c / c ++的char用于无法理解为字符的事物。char在c / c ++中经常使用,因为char的大小为1个字节。Unix中的设备也是块和字符设备。如果从char设备读取,则会得到未签名的char / bytes流。
imel96

字节流不明确。八位字节流不是。
Deer Hunter 2013年

数据可以在许多层次上解释。在底部,它只是一系列的开关电平。高一点是一个字节块,或者您所说的字节流。在更高的位置,您开始解释原始数据。字节可以通过多种方式(编码)解释为文本。整数也是如此(大或小尾数)。你甚至可以更高。您有一个zip文件。该zip文件是您昨天的备份。等等。问题在于确切的级别通常是隐式的,没有弄清楚,这可能会造成混淆。
2013年

Answers:


52

字节流包含字节。分解为实际内容,它是由1和0组成的8位。如果它代表一个数字,则它将是0到255之间的任何数字(我可能会补充说,为什么IP地址中的4个数字始终在0到255之间的范围并不是巧合)。字节通常是复杂的接口,旨在隐藏用于容纳循环缓冲区的基础基本字节数组(您填满缓冲区并等待有人清空它,这时它又会再次填满缓冲区)。

这到底代表什么?好吧,它可以表示文本文件,图像或实时视频流。它内容完全取决于谁在阅读它。十六进制表示是另一种表达同一事物的方式,尽管有时用字节的十六进制表示而不是数字来管理字节更方便,但这是一回事。

当引用原始数据时,通常是指字节数据。数据中没有标记“我是图像文件!”的标签。通常,仅在不真正关心数据代表什么时才处理原始数据。例如,如果我想将图像转换为黑白版本,我可能会说要读取图像的原始数据,并且每读取3个字节(实际上是红色,绿色和蓝色),将其数字值相加并除以3,然后将该值写入3次。本质上,我要做的是平均一个像素的红色,绿色和蓝色值,并由此得出等效的灰色像素。但是,当您谈论以“逐字节”级别对数据执行操作时,您不会

或者,也许您希望将文件保存在数据库中,但是它要求您将其“原始数据”插入Blob数据类型。这只是意味着将文件的数据转换为数据库可以理解和管理的大字节数组。您会发现,当从数据库中检索该值时,它将只是最初提供给数据库的一个大字节数组。如果该数据是文件,那么您(程序员)必须重新解释该字节数据,就像您一次读取一个字节一样。

如果有人要求您“反转4字节数据”,我会假设它指的是数字的大端与小端解释,即以最高或最低有效字节开头的数字。数字是大端还是小端都没有关系,只是所有读取该数字的系统都一致地解释该数字。

这并不是说实际的数字表示形式(或相应的十六进制表示形式)已更改,只是说这4个字节构成数字的顺序应该颠倒。假设您有0x01、0x02、0x03和0x04。要反转这些,您将改为使用0x04、0x03、0x02、0x01。系统可能会以相反的顺序读取这4个字节,并且由于您已经将其反转,因此该值将被解释为与原始数据中的预期值完全相同。

我希望这能解释!


一切顺利 ..!您能否详细说明有关“原始数据”的答案?
user2720323

@ user2720323好的,已进行修改以更好地解释“原始数据”。:)
Neil

要记住的一件事...所有数据都只是字节的集合。这些字节的含义由某种元数据(文件扩展名,数据库字段等)定义。图像文件可以解释为ASCII文件,反之亦然。文本或图像可能没有意义,但仍然可能。(Derp ...我应该看下一个答案)
Dave Nay

2
@kevincline请尝试欣赏我试图传达一个想法的事实。我的首要任务不是编写准确的算法。如果您想更准确,则可以根据人眼的感知权衡红色,绿色和蓝色值。
尼尔

18

字节只是信息的单位-它可以是任何信息。字节本身并不意味着任何东西,您必须为其赋予某种含义。

因此,进一步扩展-

它仅包含字节(十六进制数据)或二进制数据还是英文字母?

十六进制数据与二进制数据相同。这只是显示数据的另一种方式。例如,0x41 = 0b01000001 ='A'= 65(十进制)。英文字母只是其中的一部分。

如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?

由于十六进制只是数据的表示形式,因此无论您如何考虑它都无关紧要。如果您有的数据0x65 0x66 0x67 0x68,将其反转可以得到0x68 0x67 0x66 0x65。如果您以字符的形式查看此数据,本来可以拥有A B C D,但现在有了D C B A

返回字节流-只是一个数据序列。您需要知道数据代表什么才能使用它。如果我们正在读取文本文件,则在读取文件时将获得的字节流只是某种字符。可执行文件中将有一堆不可打印的字符,这就是为什么将其称为二进制文件的原因。显然,可以在文本编辑器中打开可执行文件,但是它没有任何用处。


1
+1,但是偏重于lat位的二进制文件似乎放错了位置。“二进制数据”通常确实包含不可打印的字符,但之所以称为“二进制”,是因为它由二进制数字组成,而不是因为它包含不可打印的字符。我知道您在使用“二进制”来代替可打印的“文本”数据,但是我认为这可能会使OP更加混乱。
Caleb 2013年

我有一个关于反转的问题..如果我在文件中有整数(32位)325487,我怎么能反转这4个字节的整数?类似地,我有一个单词(“ hai,你好吗”),如何通过假设每个字符为一个字节来反转此字符串。
user2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); 这实际上是获取每个字节,将其移到正确的位置,然后与其他字节合并。
尼尔

2

字节流是字节的有序序列。有第一个字节,没有前任。它的后继是第二个字节,依此类推。如今,一个字节被广泛理解为由八位组成。如果我们想更精确,则使用术语octet streamoctet。仍然存在字节宽度不为八位的计算机。

十六进制是一种写数字的方式,并用作二进制数据的打印表示形式。十六进制实际上是文本。例如,十六进制值FE可能表示一个字节:11111110具有十进制值的位255。但是FE实际上是一个由字符F和组成的字符串E,在US-ASCII或ISO-646字符集中需要两个字节!这两个字节是什么FE ,并且与值254中的单字节是什么FE 表示,作为印刷符号。

如果通信信道,或文件句柄或一些这样的装置被描述为携带字节流,并没有其他信息给出,它几乎肯定是意味着字节被表示为十六进制的文本,从而使流中的每个抽象字节需要两个物理字节。

原始数据仅表示没有被解释为具有“比特阵列”以外的任何结构的比特。原始数据通常具有结构并表示某些内容,但是当我们将其视为原始数据时,我们要么暂时忽略了解释(例如,我们正在查看数据类型的原始表示形式以验证其正确性)到位级别的详细信息),或者无法获得解释(我们有一些数据,但我们不了解数据的结构及其代表什么)。


PDP-10具有处理可变大小字节的指令。最常见的是七位ASCII,然后是六位字符。
凯文·克莱恩

0

字节为8位。位是0或1。“原始数据”只是一个字节接一个字节的流。字节流可以来自文件,网络连接,序列化对象,随机数生成器等。

  • 有几种显示字节的方法:二进制(01110110),十六进制=十六进制(7C),八进制(0271)或十进制(215)。在所有情况下,最大值均为255(以10为底)。

  • 有时,字节会分配给字符,例如ascii。在unix命令行上键入“ ascii”,您将获得一个大表,该表将字节值0-255或(0-FF十六进制)映射到关联的字符。例如,空格为x20,“ A”为x40。请注意,某些字节值映射到控制字符,并且不可打印。但是字节本身不是字符-它们只是一捆比特。一个号码。

  • “反转4个字节”将取一些字节123 42 231 0并翻转顺序-0 231 42123。应用于字节流,我可能会读取4个字节,将它们反转,再读取接下来的4个字节,依此类推。

(顺便说一句,这个问题是相关的,因为如果您想将大于255的数字表示为byes,则需要使用多个字节。但是然后的问题是,“最大”字节是在前还是后??这就是所谓的大尾数法或小尾数法-查找更多背景知识,以了解在原始字节流中对字节进行混洗为何有用。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.