谁能解释我实际上包含什么字节流?它仅包含字节(十六进制数据)或二进制数据还是英文字母?我对“原始数据”一词也感到困惑。如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?
谁能解释我实际上包含什么字节流?它仅包含字节(十六进制数据)或二进制数据还是英文字母?我对“原始数据”一词也感到困惑。如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?
Answers:
字节流包含字节。分解为实际内容,它是由1和0组成的8位。如果它代表一个数字,则它将是0到255之间的任何数字(我可能会补充说,为什么IP地址中的4个数字始终在0到255之间的范围并不是巧合)。字节流通常是复杂的接口,旨在隐藏用于容纳循环缓冲区的基础基本字节数组(您填满缓冲区并等待有人清空它,这时它又会再次填满缓冲区)。
这到底代表什么?好吧,它可以表示文本文件,图像或实时视频流。它的内容完全取决于谁在阅读它。十六进制表示是另一种表达同一事物的方式,尽管有时用字节的十六进制表示而不是数字来管理字节更方便,但这是一回事。
当引用原始数据时,通常是指字节数据。数据中没有标记“我是图像文件!”的标签。通常,仅在不真正关心数据代表什么时才处理原始数据。例如,如果我想将图像转换为黑白版本,我可能会说要读取图像的原始数据,并且每读取3个字节(实际上是红色,绿色和蓝色),将其数字值相加并除以3,然后将该值写入3次。本质上,我要做的是平均一个像素的红色,绿色和蓝色值,并由此得出等效的灰色像素。但是,当您谈论以“逐字节”级别对数据执行操作时,您不会
或者,也许您希望将文件保存在数据库中,但是它要求您将其“原始数据”插入Blob数据类型。这只是意味着将文件的数据转换为数据库可以理解和管理的大字节数组。您会发现,当从数据库中检索该值时,它将只是最初提供给数据库的一个大字节数组。如果该数据是文件,那么您(程序员)必须重新解释该字节数据,就像您一次读取一个字节一样。
如果有人要求您“反转4字节数据”,我会假设它指的是数字的大端与小端解释,即以最高或最低有效字节开头的数字。数字是大端还是小端都没有关系,只是所有读取该数字的系统都一致地解释该数字。
这并不是说实际的数字表示形式(或相应的十六进制表示形式)已更改,只是说这4个字节构成数字的顺序应该颠倒。假设您有0x01、0x02、0x03和0x04。要反转这些,您将改为使用0x04、0x03、0x02、0x01。系统可能会以相反的顺序读取这4个字节,并且由于您已经将其反转,因此该值将被解释为与原始数据中的预期值完全相同。
我希望这能解释!
字节只是信息的单位-它可以是任何信息。字节本身并不意味着任何东西,您必须为其赋予某种含义。
因此,进一步扩展-
它仅包含字节(十六进制数据)或二进制数据还是英文字母?
十六进制数据与二进制数据相同。这只是显示数据的另一种方式。例如,0x41 = 0b01000001 ='A'= 65(十进制)。英文字母只是其中的一部分。
如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?
由于十六进制只是数据的表示形式,因此无论您如何考虑它都无关紧要。如果您有的数据0x65 0x66 0x67 0x68
,将其反转可以得到0x68 0x67 0x66 0x65
。如果您以字符的形式查看此数据,本来可以拥有A B C D
,但现在有了D C B A
。
返回字节流-只是一个数据序列。您需要知道数据代表什么才能使用它。如果我们正在读取文本文件,则在读取文件时将获得的字节流只是某种字符。可执行文件中将有一堆不可打印的字符,这就是为什么将其称为二进制文件的原因。显然,可以在文本编辑器中打开可执行文件,但是它没有任何用处。
int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24);
这实际上是获取每个字节,将其移到正确的位置,然后与其他字节合并。
字节流是字节的有序序列。有第一个字节,没有前任。它的后继是第二个字节,依此类推。如今,一个字节被广泛理解为由八位组成。如果我们想更精确,则使用术语octet stream和octet。仍然存在字节宽度不为八位的计算机。
十六进制是一种写数字的方式,并用作二进制数据的打印表示形式。十六进制实际上是文本。例如,十六进制值FE
可能表示一个字节:11111110
具有十进制值的位255
。但是FE
实际上是一个由字符F
和组成的字符串E
,在US-ASCII或ISO-646字符集中需要两个字节!这两个字节是什么FE
是,并且与值254中的单字节是什么FE
表示,作为印刷符号。
如果通信信道,或文件句柄或一些这样的装置被描述为携带字节流,并没有其他信息给出,它几乎肯定是不意味着字节被表示为十六进制的文本,从而使流中的每个抽象字节需要两个物理字节。
原始数据仅表示没有被解释为具有“比特阵列”以外的任何结构的比特。原始数据通常具有结构并表示某些内容,但是当我们将其视为原始数据时,我们要么暂时忽略了解释(例如,我们正在查看数据类型的原始表示形式以验证其正确性)到位级别的详细信息),或者无法获得解释(我们有一些数据,但我们不了解数据的结构及其代表什么)。
字节为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,则需要使用多个字节。但是然后的问题是,“最大”字节是在前还是后??这就是所谓的大尾数法或小尾数法-查找更多背景知识,以了解在原始字节流中对字节进行混洗为何有用。)