2013-04-02 43 views
7

我被要求將整數轉換爲32位二進制數。 所以使用integer.toString(2)並獲得了0和1的32位二進制格式所需的值。但實際上,我被要求做的是將整數轉換爲4個字節的數據。 我無法獲得建議的輸出。我已經使用integer.toString(8),integer.toString(16)。但沒用。在javascript中將32位整數轉換爲4個字節的數據

例子:

num=1065489844 
num.toString(2) //Output: 111111100000100001010110110100 
num.toString(8) //Output: 7740412664 

請讓我知道,我欠缺的。

+3

字符串一般不一樣的二進制數據。如果你可以使用256的基數,它們將是相同的,但是'toString()'只支持高達36的基數。 – unwind

+3

你想要輸出的是什麼?目前尚不清楚預期的4字節輸出應該是什麼樣子? – jfriend00

+1

假設你的整數存儲在一個變量'x'中。然後使用'x | 0'將確保它是一個32位整數。我不知道「二進制數」是什麼意思。每種編程語言中的每個整數都以位形式存儲。 –

回答

1

如果你需要一個十六進制格式輸出,這裏是代碼。

/* Convert value as 8-bit unsigned integer to 2 digit hexadecimal number. */ 

function hex8(val) { 
    val &= 0xFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00" + hex).slice(-2); 
} 

/* Convert value as 16-bit unsigned integer to 4 digit hexadecimal number. */ 

function hex16(val) { 
    val &= 0xFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("0000" + hex).slice(-4); 
} 

/* Convert value as 32-bit unsigned integer to 8 digit hexadecimal number. */ 

function hex32(val) { 
    val &= 0xFFFFFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00000000" + hex).slice(-8); 
} 


var num = 1065489844; 
console.log("0x" + hex32(num)); // will output 0x3F8215B4 
+0

我所做的是,我使用了'num.tostring(2)'並將值發送到一個文本文件,經過觀察,我發現文本文件的大小是32字節,而不是4字節。所以正如@unwind所提到的,我需要使用256的基數。請任何人都可以告訴我,如何使用256的基數來獲得實際的二進制數。 – user1647017

+0

您需要將數據保存爲二進制文件(而不是ASCII碼),因此文件大小將爲4字節。 – Bechir

+0

以下代碼允許您以二進制格式下載包含num的文件。 文件的大小將是4字節。 ' function generateData(num){ var data = new Uint8Array(4); 爲(VAR I = 0; I <4;我++){ 數據[I] =(NUM >>(I * 8))& 0xff; } 變種團塊=新斑點([數據],{ 類型: 'Application/octet-stream' }); return window.URL.createObjectURL(blob); } var num = 1065489844; 文件。寫('download');' – Bechir

11

現在您可以使用ArrayBufferDataView。它們是原生的,所以如果您需要經常使用它,性能會更好。

function toBytesInt32 (num) { 
    arr = new ArrayBuffer(4); // an Int32 takes 4 bytes 
    view = new DataView(arr); 
    view.setUint32(0, num, false); // byteOffset = 0; litteEndian = false 
    return arr; 
} 

等於

function toBytesInt32 (num) { 
    arr = new Uint8Array([ 
     (num & 0xff000000) >> 24, 
     (num & 0x00ff0000) >> 16, 
     (num & 0x0000ff00) >> 8, 
     (num & 0x000000ff) 
    ]); 
    return arr.buffer; 
} 

它使用JavaScript位運算符來實現這一點。

+0

實際上,爲什麼'(uint8) (num&0xFF000000)>> 24'適用於例如'num = 0xF0000000':>>運算符將其操作數轉換爲32位雙補碼,因此'0xF0000000'溢出至'-0x0FFFFFFF',並被移至'-0x0F'。 Uint8Array然後通過採用'-0x0F'模'0xFF'(這裏的模不是'%'運算符,但總是根據JS規範返回肯定結果)將其值轉換爲無符號的8位整數。如預期的那樣,最終的結果是「0xF0」。將是一個很好的面試問題;) –

1

SEIAROTg的答案不輸出字符串。我已經通過了正數和負數的測試,這段代碼會給你一個4字節的字符串輸出,代表大字節格式的數字(2的補語0xFFFFFFFF = -1)。

var toBytesInt32=function(num) { 
    var ascii=''; 
    for (let i=3;i>=0;i--) { 
     ascii+=String.fromCharCode((num>>(8*i))&255); 
    } 
    return ascii; 
}; 

順便說一下,如果你想要去的其他方式,你可以使用

var fromBytesInt32=function(numString) { 
    var result=0; 
    for (let i=3;i>=0;i--) { 
     result+=numString.charCodeAt(3-i)<<(8*i); 
    } 
    return result; 
}; 

到4字節的字符串轉換爲整數

+0

這是一個JavaScript的限制。 Javascript將第一個數字的任何32位數字視爲1負數。 –

+0

我對你的代碼做了一個錯誤的假設。只要它們在(* signed *)32位整數的範圍內,對於* negative和positive *參數您的答案就可以正常工作。我會刪除我的評論,對於混淆抱歉 –

相關問題