我有一个奇怪的要求,
我的目的地仅支持一个整数,但是我想向其发送两个整数,之后又想从响应中找回它们。
例如,
允许的输入:
{
'task': 2
}
我身边有一些子任务逻辑,但是我的目标并没有意识到这一点。因此,在不通知目标的情况下,我可以以某种方式打包两个整数并在将来将其解码回来吗?
可以用十六进制实现吗?
最佳答案
您可以将任意两个数字组合起来,并使用a * (a * b) + b < Number.MAX_SAFE_INTEGER
将它们的乘积(a * b)取回。
这是一个演示代码段:
(() => {
document.addEventListener("click", handleStuff);
// formula: c = (a * (a * b)) + b
// as long as c < 9007199254740991
const combine = (a, b) => ({
a: a,
b: b,
get c() { return this.a * this.b; },
get combined() { return this.a * this.c + this.b; },
get unraveled() { return [
Math.floor(this.combined / this.c),
this.combined % this.c ]; }
});
const log = txt => document.querySelector("pre").textContent = txt;
let numbers = combine(
+document.querySelector("#num1").value,
+document.querySelector("#num2").value );
function handleStuff(evt) {
if (evt.target.nodeName.toLowerCase() === "button") {
if (evt.target.id === "combine") {
numbers = combine(
+document.querySelector("#num1").value,
+document.querySelector("#num2").value );
if (numbers.combined > Number.MAX_SAFE_INTEGER) {
log (`${numbers.combined} too large, unraveled will be unreliable`);
} else {
log (`Combined ${numbers.a} and ${numbers.b} to ${numbers.combined}`);
}
} else {
log(`${numbers.combined} unraveled to ${numbers.unraveled}`);
}
}
}
})();
input[type=number] {width: 100px;}
<p>
<input type="number" id="num1"
value="12315" min="1"> first number
</p>
<p>
<input type="number" id="num2"
value="231091" min="1"> second number
</p>
<p>
<button id="combine">combine</button>
<button id="unravel">unravel</button>
</p>
<pre id="result"></pre>
注意:@RallFriedl启发了这个答案
JSFiddle