需要为 Little Endian 系统找到正确的十六进制值
Need to find the correct Hex Value for a Little Endian system
我正在尝试确定将数字输入到 SQli 查询中的正确值是多少。通过使用十六进制值,我已经能够推断出(我相信)数据库正在使用小端。例如:
要将值修改为 255,我必须使用 00000000FF000000。
对于 1-255 的值,这很好,每次都有效。
我的问题是,对于十六进制转换为 109 和 113 的值 265 和 275,我将如何在这 16 位数字系列中定位数字?
0000000010900000 不起作用,returns 值为 36880
同样,将 109 向左移动,returns 值 9
我正在使用 http://www.scadacore.com/field-applications/programming-calculators/online-hex-converter/ 尝试确定正确的值,使用小端框。
Blob 只是一个字节数组;数据库不会以任何方式修改其内容或顺序。
字节顺序(或解释字节的任何其他方式)仅由写入和读取 blob 的应用程序确定。
值字符串似乎是由 little-endian 格式的 16 位值组成的结构或数组。
您可以通过这种方式检查值来了解这一点:
例如:
00000000FF000000
可分解为16位值:
0000 0000 FF00 0000
当交换 0xff00 的字节顺序时,我们得到 0xff,即。 255.
对于这个值:
0000000010900000
我们得到:
0000 0000 1090 0000
当字节顺序交换为 0x9010
时,我们得到 36880
,如结果所示。
您没有说明为什么需要满足 16 个字符的限制,但总的来说 - 这似乎是 结构 或 16-位数组而不是 64 位值(通常由 8 个字节或 16 个字符表示),但由于该值应该位于两端,因此它可能不是 64 位值。
这通常不是人们可以自动猜到的东西,需要您知道结构或数组定义(谈论二进制数组)。人们当然可以使用一种模式来使用不同的位置、宽度和字节顺序来查找与范围匹配的值,但我看不出你在这种情况下会比找到 structure/array 格式(上面的 猜测 4x 16 位值,但它也可以是 1x32 位、1x16 位和 2x8 位等)。
My question is, for the values 265 and 275, which in hex is converted to 109 and 113, how would I position the numbers within this 16 digit series?
要填充二进制数组,您可以将它们作为 16 位值以小端顺序放置在位置 4(0 基)。
您可以为此使用 DataView,因为它内置了对字节序的支持。
例子
转换值 275 并将其放入具有正确字节顺序和位置的数组中:
var arr = new Uint8Array(8);
var view = new DataView(arr.buffer);
// set value in correct byte-order and position
view.setUint16(4, 275, true); // pos, value, little-endian
// show result (convert to hex-string)
for (var str = "", i = 0; i < arr.length; i++) str += pad(arr[i].toString(16));
console.log(str);
function pad(s) {return s.length < 2 ? "0"+s : s}; // helper: pads to format 0x00
这会生成字符串:
0000000013010000
如果我们使用与之前相同的方法,则变成:
0000 0000 1301 0000
然后字节顺序交换 0x1301
它变成了 0x0113
,或者如预期的 275
。
我正在尝试确定将数字输入到 SQli 查询中的正确值是多少。通过使用十六进制值,我已经能够推断出(我相信)数据库正在使用小端。例如:
要将值修改为 255,我必须使用 00000000FF000000。 对于 1-255 的值,这很好,每次都有效。
我的问题是,对于十六进制转换为 109 和 113 的值 265 和 275,我将如何在这 16 位数字系列中定位数字?
0000000010900000 不起作用,returns 值为 36880 同样,将 109 向左移动,returns 值 9
我正在使用 http://www.scadacore.com/field-applications/programming-calculators/online-hex-converter/ 尝试确定正确的值,使用小端框。
Blob 只是一个字节数组;数据库不会以任何方式修改其内容或顺序。
字节顺序(或解释字节的任何其他方式)仅由写入和读取 blob 的应用程序确定。
值字符串似乎是由 little-endian 格式的 16 位值组成的结构或数组。
您可以通过这种方式检查值来了解这一点:
例如:
00000000FF000000
可分解为16位值:
0000 0000 FF00 0000
当交换 0xff00 的字节顺序时,我们得到 0xff,即。 255.
对于这个值:
0000000010900000
我们得到:
0000 0000 1090 0000
当字节顺序交换为 0x9010
时,我们得到 36880
,如结果所示。
您没有说明为什么需要满足 16 个字符的限制,但总的来说 - 这似乎是 结构 或 16-位数组而不是 64 位值(通常由 8 个字节或 16 个字符表示),但由于该值应该位于两端,因此它可能不是 64 位值。
这通常不是人们可以自动猜到的东西,需要您知道结构或数组定义(谈论二进制数组)。人们当然可以使用一种模式来使用不同的位置、宽度和字节顺序来查找与范围匹配的值,但我看不出你在这种情况下会比找到 structure/array 格式(上面的 猜测 4x 16 位值,但它也可以是 1x32 位、1x16 位和 2x8 位等)。
My question is, for the values 265 and 275, which in hex is converted to 109 and 113, how would I position the numbers within this 16 digit series?
要填充二进制数组,您可以将它们作为 16 位值以小端顺序放置在位置 4(0 基)。
您可以为此使用 DataView,因为它内置了对字节序的支持。
例子
转换值 275 并将其放入具有正确字节顺序和位置的数组中:
var arr = new Uint8Array(8);
var view = new DataView(arr.buffer);
// set value in correct byte-order and position
view.setUint16(4, 275, true); // pos, value, little-endian
// show result (convert to hex-string)
for (var str = "", i = 0; i < arr.length; i++) str += pad(arr[i].toString(16));
console.log(str);
function pad(s) {return s.length < 2 ? "0"+s : s}; // helper: pads to format 0x00
这会生成字符串:
0000000013010000
如果我们使用与之前相同的方法,则变成:
0000 0000 1301 0000
然后字节顺序交换 0x1301
它变成了 0x0113
,或者如预期的 275
。