JS Int8Array编码

JS Int8Array编码,第1张

TCP/IP开发中,出现需要自己编码的情况,这种情况需要将变量拓展为自己需要的byte[]表现形式。

假设我们需要编码格式如下:

1111 1111 1111 1111 1111 1111

第一个8位,表示文件名的长度,紧接着是文件名,然后用一个32位表示文件的长度,最后是文件数据。

这里用js中的Int8Array完成编码。Int8Array是一种TypedArray,本质上是一个数组,特点是每个元素的长度为8位(一个byte)。

假设filenameArr为文件名数组,fileArr为文件数组:

那么可以想到,4个字节的数组在java中相当于一个int,它可以表示的最大值就是2,147,483,647。我们这里就需要手动计算每个字节的值,不足32位的,需要将高位全部置成0。

采取的方法是从高到低,每次计算8位,然后放入数组

fileLengthArr[0] = fileArrlength >> 24 & 0xFF;

这里的计算方式是先把要放入的值右移24位,再截取后8位,得到其高8位的值,比如文件长度是1,895,825,407个字节,那么其二进制表示就是

01110000111111111111111111111111

右移24位得到

0000 0000 0000 0000 0000 0000 1000 1111

跟0xFF,也就是1111 1111 做与运算,就得到

1000 1111

再比如文件长度是16,777,215个字节,那么其二进制表示就是

1111 1111 1111 1111 1111 1111

只用了24位就表示完了,那么右移24位,我们会得到

0000 0000 0000 0000 0000 0000 0000 0000

做与运算,得到

0000 0000

可以看到符合我们的需求,也就是不足32位的,高位用0补齐。

依次类推,依次计算每个8位的值:

再把这个数组拼接到结果中:

result = resultconcat(fileLengthArr)concat(fileArr);

如果要用WebSocket传输,那么要将这个array转换成ArrayBuffer:

var resultBuffer =new Int8Array(result)buffer;

用上面的例子,如果文件名长度是255,文件长度是65535,那么result应该是这样的:

[255, (255个元素)0,0,255,255,(65535个元素)]

解码时,先取一个字节(8位),作为文件名的长度,然后向后取255个元素,转换成文件名,再取4个字节,作为文件的长度,再向后取65535个字节,存储成文件。

总结:

这里学到了几个基本概念,首先一个byte[],字节数组,里面的每个元素都是8位,刚好对应一个字节,方便存取。其次是位移的概念,右移24位相当于取一个32位的值的高8位,& 0xFF运算相当于只保留这个值的低8位(一个F(hex)=1111(bin))。这里用到的编码格式是一种较为粗糙的格式,长度位能表现的最大值固定,且位数固定,效率不是最高的。但基本理念要厘清,就是在编码时,我们是按照每8位依次计算并存入数组的。

‍‍

JS字符串的长度受到下标限制。理论最大长度是2^53-1(即js中可表达的最大安全整数)。2^53是多大呢?大约9PB。根据统计,中国2014年所有出版物(不计复本)不到2000亿字,也就是400GB而已。按此推算,不要说存一个txt了,中国自有甲骨文以来所有的书、各类出版物字数加在一起估计也不可能超过100TB,也就是01PB。当然啦,实际引擎是不可能允许分配那么大的字符串的,你的电脑也没那么大存储不是。V8的heap上限只有2GB不到,允许分配的单个字符串大小上限更只有大约是512MB不到。JS字符串是UTF16编码保存,所以也就是268亿个字符。FF大约也是这个数字。根据最长的网络小说是哪部,目前最长的网络小说大概2000万字。所以还是绰绰有余的。《道藏》大约7000万字,《大藏经》大约1亿字,也是存得下的。不过《永乐大典》有37亿字,《四库全书》有8亿字,V8/FF的一个字符串就存不下喽。然而IE11貌似可以存4GB的字符串,即21亿字。其实限制是在服务器资源、网速和存储。你文本还没读完,值还没赋完,内存不够了。内存够了,几百m几个G的变量,搞得页面请求超时了,访客没耐心关掉了,或者浏览器内存崩溃了。取一次吗?还是经常要用,要持久化不,数据库肯定存不下,文件存吧〔占硬盘,存不了几个〕,又每次要io读。你干嘛不搞几百字的简介,配个图,附上文件的下载地址〔放网盘,2T内免费〕不是很好吗。

‍‍

首先你要设定好文本框宽度,然后手动输入字符(最好用数字)来确定文本框有中能输入多少个数字。

一个数字、一个英文字母 = 1个字节

一个汉字 = 2个字节

有了以上信息:我们就可以用js或jquery去获取文本框中的文本,计算文本框中有多少个字节。

假设:

文本框宽 = 30像素 实际可以写入10个数字也就是10个字节,多于10就超出文本框的款度。

再假设文本框中输入:123abc字节数

用js通进正则我们找出汉字个数 乘以 2 就是汉字所占的字节,加上非汉字的字符(全角符号也是2个字节),上例中一个有12个字节

我们知道现文本框中 >10字符就超出了文本框宽度。

思路是img标签中的dynsrc属性。

在FireFox、Chrome浏览器中可以根据documentgetElementById(“id_file”)files[0]size 获取上传文件的大小(字节数),而IE浏览器中不支持该属性,只能借助<img>标签的dynsrc属性,来间接实现获取文件的大小(但需要同意ActiveX控件的运行,但是不会引起上面的不友好、不安全的提示)。

参考如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 10 Strict//EN"">

将每一个字节表示的十六进制表示的内容,用字符串来显示。

UTF(UCS Transformation Format)规范,常见的UTF规范包括UTF-8、UTF-7、UTF-16

使用2个字节表示已经有码点的字符。UCS-2只是一个编码方案,UTF-16却要用于实际的传输

UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码

js使用的编码

中日韩统一表意文字

每个汉字由两个字节构成

是针对繁体汉字的汉字编码,台湾地区常用,共收录13,060个汉字

该函数能解码由创建或其它流程得到的统一资源标识符(URI)。

方法用于解码由方法或者其它类似方法编码的部分统一资源标识符(URI)。

escape生成新的由十六进制转义序列替换的字符串

计算生成一个新的字符串,其中的十六进制转义序列将被其表示的字符替换。

以上就是关于JS Int8Array编码全部的内容,包括:JS Int8Array编码、js字符串最多存储多少字节、html中,怎样用js或者jQuery去判断文本框输入的文本内容超过了文本框的宽度。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9565118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存