计算数组的位/字节大小

Posted

技术标签:

【中文标题】计算数组的位/字节大小【英文标题】:Count bit/byte size of array 【发布时间】:2013-10-21 16:45:29 【问题描述】:

我在 javascript 中有一个包含很多子数组的数组。计算数组包含多少位/字节的最佳/最简单方法是什么?我要将数组发送到我的 php 服务器,它只能是 5kB 大。

有没有本地方法可以做到这一点?我对比特不太熟悉。如果我理解正确,则 1 个字符适合 8b/1B(尽管它显然取决于编码)。最好的方法是遍历所有数组并计算字符数吗?

【问题讨论】:

看看这个链接***.com/a/11900218/4836581看起来更准确。 【参考方案1】:

你可以这样做:(为了得到真正好的估计)

var g = JSON.stringify(myBigNestedarray).replace(/[\[\]\,\"]/g,''); //stringify and remove all "stringification" extra data
alert(g.length); //this will be your length.

例如:看看这个嵌套数组:

var g=[1,2,3,['a','b',['-','+','&'],5],['שלום','יגבר']]

JSON.stringify(g).replace(/[\[\]\,\"]/g,'')

 "123ab-+&5שלוםיגבר"

它的长度是:17(字节)

这样 - 您可以利用 json.parse 的优势来完成大部分工作 - 然后移除额外的数组持有者。

【讨论】:

【参考方案2】:

首先,您必须将数组转换为用于将数据传输到服务器的字符串表示形式。数组的大小无关紧要,因为它将是要传输的字符串。根据您序列化该数组的方式,大小差异可能非常显着。

序列化数组的可能选项是jQuery.param() 方法或JSON.stringify()。您还可以构建自己的方法来转换值,以便您的 PHP 代码可以理解它。

获得该字符串后,您使用stringValue.length * 8 获取大小,假设 a) 值是 ASCII 或 b) 您对所有值进行 url 编码,以便将 Unicode 字符转换为 ASCII。 *8 是用来获取位的,但既然你提到限制是 5kB - 这些很可能是字节,所以你跳过乘法。

【讨论】:

引用jQuery.param docs:“注意:由于没有普遍认可的参数字符串规范,因此不可能使用此方法以理想的方式对复杂的数据结构进行编码。支持此类输入的语言。使用 JSON 格式作为对复杂数据进行编码的替代方案。" 运算想知道数组拥有多少字节。您的解决方案不考虑表示数组 []" 等的额外字符...所以根据您的解决方案 - [1] 的长度为 3,这是不正确的(它的长度为 1)。 @RoyiNamir 他是这么说的,但我不认为这就是他的意思。如果他只能向服务器传输5kB,那么序列化数据的长度很重要。 [1] 的长度为 8,因为 JavaScript 将 1 存储为 64 位 IEEE 754 浮点数。你看,他的问题是模棱两可的。 @Prinzhorn 我读到:“数组包含多少字节。”这就是我的回答。 :-) @RoyiNamir 我读到:“我要将数组发送到我的 PHP 服务器”,这就是我的答案。 :-)。但是够了;)【参考方案3】:

您可以使用Blob 来获取转换为字符串时的数组大小(以字节为单位)。

例子:

const myArray = [test: 1234, foo: false, bar: true];

console.info(new Blob([JSON.stringify(myArray)]).size); // 38

【讨论】:

小心这一点,我认为它非常适合单次使用,但是当我使用它来“测量”我用作非常快速传入 websocket 的缓冲区的数组的大小时,我遇到了大量的内存泄漏数据(随着它的增长每 5 秒测量一次)...它在几分钟内将内存使用量从一开始的 25MB 完全炸毁到 1GB...非常奇怪

以上是关于计算数组的位/字节大小的主要内容,如果未能解决你的问题,请参考以下文章

C程中如何计算数组(一维及二维)占内存空间的大小

计算机系统漫游

C和指针思想精髓

怎么确定Java对象的大小

Java 迭代字节数组中的位

C 语言二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )