Encoding 如何将整数编码成其他整数?

Encoding 如何将整数编码成其他整数?,encoding,integer,byte,bitstream,Encoding,Integer,Byte,Bitstream,作为后续,我想知道是否有一个通用性,您可以将n个x位数字存储为m个y位数字。例如,您可以将5个8位数字存储为3个15位数字。或者将2个8位数字转换为1个16位数字,或者将3个16位数字转换为2个32位数字。想知道对于这样做的过程,编码和解码的实现是什么,或者如果不可能的话 比如: 函数编码(i,s1,n,s2){ //i=输入字节数组 //s1=输入字节的大小 //n=输出字节数 //s2=输出字节的大小 } 函数解码(i,s1,n,s2){ } 根据下面的答案,我试着将其翻译成JavaScr

作为后续,我想知道是否有一个通用性,您可以将n个x位数字存储为m个y位数字。例如,您可以将5个8位数字存储为3个15位数字。或者将2个8位数字转换为1个16位数字,或者将3个16位数字转换为2个32位数字。想知道对于这样做的过程,编码和解码的实现是什么,或者如果不可能的话

比如:

函数编码(i,s1,n,s2){
//i=输入字节数组
//s1=输入字节的大小
//n=输出字节数
//s2=输出字节的大小
}
函数解码(i,s1,n,s2){
}
根据下面的答案,我试着将其翻译成JavaScript,但不理解任何东西的真正含义,也不认为它有效

函数编码(输入、输入大小、输出大小、回调){
变量缓冲区=0
var bbits=0
变量掩码=(1>=输出大小
bbits-=输出大小
}
}
一般情况下是“流式传输”,无论所有内容有多么严重的不一致,它都会起作用。通常,它通过降低效率来为通用性买单。它的基本工作原理是将输入放入缓冲区,直到至少有一个输出块可以从中提取出来,然后提取所有输出,如下所示:

buffer = 0
bbits = 0
mask = (1 << outSize) - 1
while more input:
    while bbits < outSize:
        buffer |= in() << bbits
        bbits += inSize
    while bbits >= outSize:
        out(buffer & mask)
        buffer >>= outSize
        bbits -= outSize
if bbits != 0:
    out(buffer & mask)
buffer=0
bbits=0
遮罩=(1>=超大
bbits-=超大
如果bbits!=0:
输出(缓冲区和掩码)
编码和解码在概念上是相同的,但大小是交换的。当专用于特定大小的输入和输出块时,其中一个内部循环将不会是循环。也可以使用另一种打包顺序,将输入块的高位输出在低位之前,任何选择

缓冲区的大小必须至少为
outSize-1+inSize
,以适应从缓冲区输出后剩余的最大位数后的读取输入

在这个过程中,大小甚至可以更改。

你不能将5个8位数字存储为3个15位数字,因为45位信息显然不适合40位的内存。只有当总变化数小于或等于2k,k是用于编码的位数时,你才能这样做

如果每个值的宽度都相同,那么我的尝试是这样的:以big-endian线性存储位。encode函数将字节数组中的位转换为另一个数组,该数组将完整值存储在
位长度
位中,而decode函数则做相反的事情

函数编码(输入,位长度){
//每个数组元素的大小必须大于位长度
var输出=新的UINT16数组(Math.ceil(input.length*8/位长度));
var remainingBits=位长度;//为当前值保留的剩余位
//bitLength=11时的示例
//当前值的起始值
//       │          下一个值
//       │2345678901│
// ...┆  ↓    ┆     ↓ ┆       ┆       ┆       ┆...      ← 输入字节
// ...₀₁₂₃₄₅₆₇⁰¹²³⁴⁵⁶⁷₀₁₂₃₄₅₆₇⁰¹²³⁴⁵⁶⁷₀₁₂₃₄₅₆₇ ...      ← 钻头位置
对于(变量inIdx=0,outIdx=0;inIdx8){
输出[outIdx]=(输出[outIdx]nextRemainingBits);
//输入字节中的剩余位(nextRemainingBits)
//进入下一个输出

output[++outIdx]=input[inIdx]&(我想知道您是否可以创建一个JavaScript示例,我还没有找到确切的翻译方法:)我不明白什么是
bbits
,不过我想我已经掌握了其余的输入编码。了解输出编码会很有帮助:,也许还可以解释一下它是如何工作的,有很多我不太擅长的小动作。谢谢你的帮助。我的impl进入了无限循环lol。@LancePollard
bbits
是当前缓冲的位数。虽然我不知道为什么会有无限循环,但我确实看到了第二个循环中的一些差异,而我仍然不知道如何使用它:/