[英]Javascript: convert a (hex) signed integer to a javascript value
我有一個以十六進制數給出的有符號值,例如0xffeb
並希望將其轉換為-21
作為“正常”Javascript 整數。
到目前為止,我已經編寫了一些代碼:
function toBinary(a) { //: String
var r = '';
var binCounter = 0;
while (a > 0) {
r = a%2 + r;
a = Math.floor(a/2);
}
return r;
}
function twoscompl(a) { //: int
var l = toBinaryFill(a).length;
var msb = a >>> (l-1);
if (msb == 0) {
return a;
}
a = a-1;
var str = toBinary(a);
var nstr = '';
for (var i = 0; i < str.length; i++) {
nstr += str.charAt(i) == '1' ? '0' : '1';
}
return (-1)*parseInt(nstr);
}
問題是,我的函數對於兩個數字都返回 1 作為 MSB,因為只在二進制表示形式“字符串”的 MSB 處查看。 對於這種情況,兩個數字都是 1:
-21 => 0xffeb => 1111 1111 1110 1011
21 => 0x15 => 1 0101
你有什么想法來實現這個更有效和更好的嗎?
問候,神話
使用parseInt()
進行轉換( parseInt()
接受你的十六進制字符串):
parseInt(a);
然后使用掩碼確定是否設置了 MSB:
a & 0x8000
如果它返回一個非零值,你就知道它是負數。
總結一下:
a = "0xffeb";
a = parseInt(a, 16);
if ((a & 0x8000) > 0) {
a = a - 0x10000;
}
請注意,這僅適用於 16 位整數(C 中的short
)。 如果您有一個 32 位整數,則需要不同的掩碼和減法。
我想出了這個
function hexToInt(hex) {
if (hex.length % 2 != 0) {
hex = "0" + hex;
}
var num = parseInt(hex, 16);
var maxVal = Math.pow(2, hex.length / 2 * 8);
if (num > maxVal / 2 - 1) {
num = num - maxVal
}
return num;
}
和用法:
var res = hexToInt("FF"); // -1
res = hexToInt("A"); // same as "0A", 10
res = hexToInt("FFF"); // same as "0FFF", 4095
res = hexToInt("FFFF"); // -1
所以基本上十六進制轉換范圍取決於十六進制的長度,這就是我要找的。 希望能幫助到你。
基於@ Bart Friederichs我來了:
function HexToSignedInt(num, numSize) {
var val = {
mask: 0x8 * Math.pow(16, numSize-1), // 0x8000 if numSize = 4
sub: -0x1 * Math.pow(16, numSize) //-0x10000 if numSize = 4
}
if(parseInt(num, 16) & val.mask > 0) { //negative
return (val.sub + parseInt(num, 16))
}else { //positive
return (parseInt(num,16))
}
}
所以現在您可以指定確切的長度(以半字節為單位)。
var numberToConvert = "CB8";
HexToSignedInt(numberToConvert, 3);
//expected output: -840
function hexToSignedInt(hex) {
if (hex.length % 2 != 0) {
hex = "0" + hex;
}
var num = parseInt(hex, 16);
var maxVal = Math.pow(2, hex.length / 2 * 8);
if (num > maxVal / 2 - 1) {
num = num - maxVal
}
return num;
}
function hexToUnsignedInt(hex){
return parseInt(hex,16);
}
第一個用於有符號整數,第二個用於無符號整數
由於我必須將絕對數值轉換為范圍從 -2^24 到 2^24-1 的 int32 值,因此我想出了這個解決方案,您只需通過parseInt(hex, 16)
將輸入更改為數字,在您的情況下,nBytes 為 2。
function toSignedInt(value, nBytes) { // 0 <= value < 2^nbytes*4, nBytes >= 1,
var hexMask = '0x80' + '00'.repeat(nBytes - 1);
var intMask = parseInt(hexMask, 16);
if (value >= intMask) {
value = value - intMask * 2;
}
return value;
}
var vals = [ // expected output
'0x00', // 0
'0xFF', // 255
'0xFFFFFF', // 2^24 - 1 = 16777215
'0x7FFFFFFF', // 2^31 -1 = 2147483647
'0x80000000', // -2^31 = -2147483648
'0x80000001', // -2^31 + 1 = -2147483647
'0xFFFFFFFF', // -1
];
for (var hex of vals) {
var num = parseInt(hex, 16);
var result = toSignedInt(num, 4);
console.log(hex, num, result);
}
var sampleInput = '0xffeb';
var sampleResult = toSignedInt(parseInt(sampleInput, 16), 2);
console.log(sampleInput, sampleResult); // "0xffeb", -21
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.