什么是字节数组?

119

请问,有人能解释一下吗?我不太理解这个概念。

什么是字节数组?

在应用程序/程序中何时何地我们会使用它?

使用字节数组的优缺点是什么?


我想这是有道理的,因为如果你阅读Java I/O类,例如ByteArrayInputStream和ByteArrayOutputStream。除非人们理解ByteArray,否则如何澄清ByteArrayInputStream和ByteArrayOutputStream的含义呢? - CuriousMind
3个回答

92

字节是8位二进制数据。

字节数组是一组字节(tautology FTW!)。

您可以使用字节数组来存储二进制数据的集合,例如文件内容。但这样做的缺点是必须将整个文件内容加载到内存中。

对于大量的二进制数据,最好使用流式数据类型(如果您的语言支持)。


21
从极端严谨的角度来看,一个字节并不能保证是8个比特位。尽管在当今它确实是事实上的标准,但从历史上来看,并不总是这种情况。参见http://en.wikipedia.org/wiki/Byte。 - JaredPar
16
准确,但我认为每次有人说一个字节是8位时都需要免责声明可能有点过头了。 - Dinah
6
@Dinah,我同意,这就是为什么我加了一句学究式的免责声明。我今天刚好在看相关页面。 - JaredPar
7
请解释一下“这样做的缺点是必须将整个文件内容加载到内存中”的意思。 - CodeYogi
1
@JeffOrris 不确定你所说的“转换为字节数组”的意思。那通常不是你会做的事情。另外,“更不容易受到攻击”指的是什么? - Phil
显示剩余3条评论

68

我假设您知道字节是什么。一组字节数组就是一块连续的内存区域,其中包含一串连续的字节,这使得可以按顺序讨论它们:第一个字节、第二个字节等等。

就像字节可以编码不同类型和范围的数据(从 0 到 255 的数字、从 -128 到 127 的数字、使用 ASCII 编码的单个字符例如 'a' 或 '%'、CPU 操作码)一样,字节数组中的每个字节可以是其中任何一种,或者对于一些具有更大范围的数字(例如从 0 到 65535 的 16 位无符号整数)、国际字符集、文本字符串 ("hello") 或已编译计算机程序的部分/全部贡献到一些多字节值。

字节数组的关键在于它提供了对存储在那部分内存中的每个 8 位值的索引(快速)、精确和原始的访问,并且您可以操作这些字节以控制每个单独的比特。不好的一点是,计算机只将每个条目视为独立的 8 位数字-这可能是您的程序正在处理的内容,或者您可能更喜欢一些强大的数据类型,例如跟踪其自身长度并根据需要增长的字符串,或者浮点数让您存储像 3.14 这样的数字而不必考虑比特表示。作为一种数据类型,在长数组的开头附近插入或删除数据是低效的,因为所有后续元素都需要被移动以创建/填充所创建/所需的间隙。


12

来自维基百科

在计算机科学中,数组数据结构或简单地称为数组是一种数据结构,它由一组元素(值或变量)组成,每个元素由一个或多个整数索引标识,并存储每个元素的地址可以通过一个简单的数学公式从其索引元组计算。

因此,当你说字节数组时,指的是包含一组字节(8位)大小元素的定义长度(例如元素数量)的数组。

在C#中,字节数组可能如下所示:

byte[] bytes = { 3, 10, 8, 25 };

以上示例定义了一个包含4个元素的数组,每个元素的长度最长可为1个 字节(Byte)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接