众所周知,字节范围是0到255
我有两个字节,我想创建另一个可逆的数字,但最小长度组合这两个数字并创建一个新的,最简单的解决方案是
a = b1 * 1000 + b2
反向将是
b1 = a / 1000
b2 = a%1000
上述解决方案的长度变化0到6长度,我想要一个具有FIXED和最小长度的公式
答案 0 :(得分:5)
编码:
x = b1 * 256 + b2;
x = x + 10000;
解码:
x = x - 10000;
b1 = x >> 8;
b2 = x & 255;
编码结果的长度始终为5(包括10000
到75535
。并且由于存在65536个不同的对(b1,b2),因此无法将它们编码为长度< 5(因为最多有10000个这样的数字)。
答案 1 :(得分:1)
这里最简单的通用解决方案是
a = b1 * 256 + b2;
又名
a = (b1 << 8) | b2;
然后让他们回来(假设你有无符号字节可用):
b1 = (a >> 8) & 0xff;
b2 = a & 0xff;
除非您认为b1=0, b2=*
的结果为一个字节(因为每个值小于256),否则将为所有输入生成一个2字节的值。您可以潜在交错,这样每个输入字节的低4位最终会在输出的低8位中结束,因此您最终得到的值小于256( b1 < 16, b2 < 16
)。坦率地说,最简单的方法就是将其视为2字节值,使用上述移位。
使用2个字节显然是最小的,并且很容易实现。
如果这不是您想要的,请提供更多信息。
编辑:我一直在假设您正在寻找一个固定的二进制长度。如果你想要一个固定的十进制长度,请使用falagar的解决方案。
答案 2 :(得分:1)
如果您的意思是以十进制表示的固定长度数字,您可以使用:
a = 100,000 + b1 * 256 + b2
这将为您提供100,000到165,535之间的数字。
要扭转操作:
b1 = (a - 100,000) / 256
b2 = (a - 100,000) % 256