Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当忽略每个字节的前导位时,是否有一种简单的方法从一组字节生成一个数字?_Javascript_Bit Manipulation_Id3_Arraybuffer - Fatal编程技术网

Javascript 当忽略每个字节的前导位时,是否有一种简单的方法从一组字节生成一个数字?

Javascript 当忽略每个字节的前导位时,是否有一种简单的方法从一组字节生成一个数字?,javascript,bit-manipulation,id3,arraybuffer,Javascript,Bit Manipulation,Id3,Arraybuffer,我试图用谷歌浏览器中的JavaScript从一组字节中生成一个数字,从一个数组中获取MP3标签信息。ID3v2规范规定,要获取标记大小,必须在特定位置获取4个字节并从中获取整数值,以下情况除外: ID3v2标记大小用 四个字节,其中最重要的 位(位7)在每个 字节,总计28位。这个 零位被忽略,因此257 字节长的标记表示为$00 00 02 01 这样做的简单方法似乎是遍历每个字节,获得每个位的值,并生成一个新的4字节值,由原始4字节的7位生成,例如,我们有以下4个原始字节: 0111 111

我试图用谷歌浏览器中的JavaScript从一组字节中生成一个数字,从一个数组中获取MP3标签信息。ID3v2规范规定,要获取标记大小,必须在特定位置获取4个字节并从中获取整数值,以下情况除外:

ID3v2标记大小用 四个字节,其中最重要的 位(位7)在每个 字节,总计28位。这个 零位被忽略,因此257 字节长的标记表示为$00 00 02 01

这样做的简单方法似乎是遍历每个字节,获得每个位的值,并生成一个新的4字节值,由原始4字节的7位生成,例如,我们有以下4个原始字节:

0111 1111 0111 1111 0111 1111 0111 1111
我创建了一个新的ArrayBuffer并通过每个位循环生成:

0000 1111 1111 1111 1111 1111 1111 1111
然后我使用


有更简单的方法吗?

如果你仔细想想,你得到的是一个4位数的基数128。每个字节包含一个“数字”,每个“数字”是一个介于0和127(包括)之间的值。因此,要将它们转换为可用的数字,只需像处理任何其他基数一样进行乘法和加法:最低有效的“数字”是“一个位置”数字,下一个是“128s”,下一个是“16384s”,最高有效的数字是“2097152s”位置


我不确定如何在代码中显示这一点,因为我不太熟悉新的“ArrayBuffer”API;您使用“ArrayBufferView”或其他方法来访问这些值,对吗?好吧,假设很容易得到单个字节,那么进行乘法和加法应该是一个非常简单的函数。

如果你仔细想想,你得到的是一个4位数的基数128。每个字节包含一个“数字”,每个“数字”是一个介于0和127(包括)之间的值。因此,要将它们转换为可用的数字,只需像处理任何其他基数一样进行乘法和加法:最低有效的“数字”是“一个位置”数字,下一个是“128s”,下一个是“16384s”,最高有效的数字是“2097152s”位置


我不确定如何在代码中显示这一点,因为我不太熟悉新的“ArrayBuffer”API;您使用“ArrayBufferView”或其他方法来访问这些值,对吗?假设很容易获得单个字节,那么进行乘法和加法应该是一个非常简单的函数。

如果您只针对Chrome,您还可以使用DataView读取ByTestStream的不同数据类型:

如果您只针对Chrome,您还可以使用DataView读取ByTestStream的不同数据类型:

为什么不将其作为解释以128为基数表示的4位数字来处理呢?将高字节值乘以2097152,下一个乘以16384,下一个乘以128,然后将这些乘积与最后一个字节的值相加。让我想想,为什么要将您的答案作为注释而不是实际答案发布?我认为这是一个更好的解决方案。我希望我能投票赞成你的答案。我正准备为我的一个孩子准备早餐,我没有时间输入一个完整的答案:-我现在就去做……为什么你在为你的孩子们准备早餐时检查堆栈溢出?我很高兴你能回答。为什么不把它当作解释一个以128为基数的4位数字呢?将高字节值乘以2097152,下一个乘以16384,下一个乘以128,然后将这些乘积与最后一个字节的值相加。让我想想,为什么要将您的答案作为注释而不是实际答案发布?我认为这是一个更好的解决方案。我希望我能投票赞成你的答案。我正准备为我的一个孩子准备早餐,我没有时间输入一个完整的答案:-我现在就去做……为什么你在为你的孩子们准备早餐时检查堆栈溢出?(我很高兴你回答了。)是的,效果很好<代码>头=新的Uint8Array(数据,0,10)tagSize=header[6]*Math.pow(128,3);tagSize+=header[7]*Math.pow(128,2)等等。是的,工作得很好<代码>头=新的Uint8Array(数据,0,10)tagSize=header[6]*Math.pow(128,3);tagSize+=header[7]*Math.pow(128,2)等等。这真是太棒了。谢谢。:)那太棒了。谢谢。:)