首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是字节流?

什么是字节流?
EN

Software Engineering用户
提问于 2013-11-05 16:45:02
回答 4查看 49K关注 0票数 42

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

EN

回答 4

Software Engineering用户

发布于 2013-11-05 17:13:30

字节流包含字节。实际上,它是由1s和0s组成的8位。如果它代表一个数字,它将是从0到255的任何数字(我可以补充一点,这不是巧合,为什么IP地址中的4个数字总是在0到255之间)。字节流通常是复杂的接口,用于隐藏用于保存循环缓冲区的底层基本字节数组(您填充缓冲区并等待有人将其清空,此时它只会再次填充缓冲区)。

那到底代表了什么?它可以代表一个文本文件,一个图像,或者一个实时视频流。它是什么完全取决于谁正在阅读它的背景。十六进制表示是表达相同事物的另一种方式,尽管有时根据它们的十六进制表示而不是数字来管理字节更方便--然而,这是一回事。

当您引用原始数据时,通常指的是字节数据。这些数据没有标签,上面写着“我是一个图像文件!”通常,您只处理原始数据时,您并不真正关心数据所代表的整体。例如,如果我想将一个图像转换成它的黑白版本,我可能会说读取一个图像的原始数据,每读取3个字节(实际上是红色的表示,绿色的表示,蓝色的表示),添加它的数字值并除以3,然后将该值写入3次。本质上,我要做的是平均一个像素的红色、绿色和蓝色值,并由此生成它的灰色等效像素。但是,当您谈到在“逐字节”级别上对数据执行操作时,可以说,您并不真正关心大局。

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

如果有人要求您“反转4字节的数据”,我会假设它指的是大端对小端数字的解释,它以最重要或最不重要的字节开始写入数字。一个数字是否表示为大端或小端点并不重要,只是所有读取数字的系统都会一致地解释它。

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

我希望这就解释了!

票数 59
EN

Software Engineering用户

发布于 2013-11-05 17:23:38

字节只是一个信息的单位-它可以是任何东西。一个字节本身并不意味着什么,你必须给它附加某种意义。

所以,在这一点上-

它只包含字节(十六进制数据)、二进制数据或英文字母吗?

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

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

因为十六进制只是数据的表示,所以你怎么看待它并不重要。如果您有0x65 0x66 0x67 0x68的数据,要反转它,您将得到0x68 0x67 0x66 0x65。如果您从字符的角度来查看这些数据,那么最初您将拥有A B C D,但现在您拥有了D C B A

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

票数 20
EN

Software Engineering用户

发布于 2013-11-05 22:47:52

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

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

如果通信通道、文件句柄或其他设备被描述为承载字节流,而没有给出其他信息,则几乎肯定不意味着字节被表示为十六进制文本,因此流中的每个抽象字节都需要两个物理字节。

而原始数据只是指不被解释为除了“位数组”之外的任何结构的位。原始数据通常有一个结构并表示某物,但当我们将其视为原始数据时,我们要么暂时忽略解释(例如,我们正在查看数据类型的原始表示,以验证其正确性,直到比特级的细节),要么解释不可用(我们有一些数据,但我们不了解数据的结构及其代表的是什么)。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/216597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档