假设我们需要编码格式如下:
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] = fileArr.length >>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 = result.concat(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位依次计算并存入数组的。
var buildVOList = function(data) {//深拷贝
//var voList = util.getCache('voList')
var voList = []
for (var i = 0, l = data.lengthi <li++) {
var el = data[i]
var obj = new WifiVO({
stime: el.stime,
macadd: el.macadd,
vendor: el.vendor,
VlanID: el.VlanID,
protocolName: el.protocolName,
sessionTime: el.sessionTime,
Avg: el.Avg,
Bytesent: el.Bytesent,
ByteReceived: el.ByteReceived,
RSSI: el.RSSI,
building: el.building,
room: el.room
})
//console.log(obj)
voList.push(obj)
}
return voList
}
function initApp(){
initDataTree()
}
function initDataTree(callback) {
//传入数据
$.getJSON('data/test.json', function(data) {
//console.log(data)
buildVOList(data)
callback &&callback()
})
}
links 是节点数组中的索引,应该从0开始。从1开始,因此最高的数字' t存在,并给你这个错误。
这篇文章主要介绍了js判断iframe内的网页是否滚动到底部触发事件,需要的朋友可以参考下之前有个需求是要判断iframe内的网页是否滚动到底部触发事件,
网上找了许多资料都是说在当前页面下的,
索性就自己研究了一下,
找到了解决方法.
clientHeight:这个元素的高度,占用整个空间的高度
offsetHeight:是指元素内容的高度
scrollTop:可以理解为滚动条可以滚动的长度
以下是源代码
代码如下:
<iframe
src="~/Files/3.html"
id="iframepage"
width="825"
onload="func()"></iframe>
<script
type="text/javascript">
function
func()
{
var
ifm
=
document.getElementById("iframepage")
ifm.height
=
window.document.body.clientHeight
-
100
}
<!--在chrome有兼容问题,FF和IE10无问题,网上说chrome访问iframe要在服务器环境下,不知道什么情况-->
window.document.getElementById("iframepage").contentWindow.onscroll
=
function
aaa()
{
var
ifm
=
document.getElementById("iframepage").contentWindow.document.documentElement
if
(ifm.scrollTop
==
ifm.scrollHeight
-
ifm.clientHeight)
{
alert("到底了")
}
}
</script>