2013-04-02 62 views
7

Tôi được yêu cầu chuyển đổi số nguyên thành số nhị phân 32 bit. Vì vậy, được sử dụng integer.toString(2) và nhận giá trị yêu cầu ở định dạng nhị phân 32 bit của 0 và 1. Nhưng thực sự những gì tôi được yêu cầu làm là chuyển đổi số nguyên thành 4 byte dữ liệu. Tôi không thể nhận được kết quả như đã đề xuất. Tôi đã sử dụng integer.toString(8), integer.toString(16). nhưng không sử dụng.Chuyển đổi số nguyên 32 bit thành 4 byte dữ liệu trong javascript

Ví dụ:

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

Xin vui lòng cho tôi biết, nơi tôi đang thiếu.

+3

Strings thường không giống như dữ liệu nhị phân . Nếu bạn có thể sử dụng cơ số 256, chúng sẽ giống nhau, nhưng 'toString()' chỉ hỗ trợ các cơ sở lên đến 36. – unwind

+3

Bạn muốn đầu ra là gì? Không rõ đầu ra 4 byte dự định sẽ trông như thế nào? – jfriend00

+1

Giả sử số nguyên của bạn được lưu trong một biến 'x'. Sau đó sử dụng 'x | 0' sẽ đảm bảo rằng đó là số nguyên 32 bit. Tôi không biết ý bạn là gì bởi "số nhị phân". Mỗi số nguyên trong mỗi ngôn ngữ lập trình được lưu trữ dưới dạng bit. –

Trả lời

1

nếu bạn cần đầu ra định dạng thập lục phân, dưới đây là mã.

/* 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

Những gì tôi đã làm là, tôi đã sử dụng 'num.tostring (2)' và gửi giá trị vào một tệp văn bản, và sau khi quan sát, tôi thấy rằng kích thước của tệp văn bản là 32byte, nhưng không phải 4 byte. Vì vậy, như đã đề cập bởi @unwind tôi cần phải sử dụng cơ sở 256. Xin vui lòng bất cứ ai có thể cho tôi biết, làm thế nào để sử dụng cơ sở 256 để có được số nhị phân thực tế. – user1647017

+0

Bạn cần lưu dữ liệu dưới dạng nhị phân (không phải là ASCII), vì vậy kích thước tệp sẽ là 4 byte. – Bechir

+0

Mã sau đây cho phép bạn tải xuống tệp có chứa số của bạn ở định dạng nhị phân. Kích thước của tệp sẽ là 4 byte. ' hàm generateData (num) { var data = new Uint8Array (4); for (var i = 0; i <4; i ++) { dữ liệu [i] = (num >> (i * 8)) & 0xff; } var blob = Blob mới ([dữ liệu], { loại: 'Ứng dụng/octet-stream' }); cửa sổ trả lại.URL.createObjectURL (blob); } var num = 1065489844; tài liệu.viết ('download'); ' – Bechir

11

Bây giờ bạn có thể sử dụng ArrayBufferDataView. Họ là người bản xứ nên hiệu suất sẽ tốt hơn nhiều nếu bạn cần sử dụng nó thường xuyên.

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; 
} 

tương đương với

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

mà sử dụng toán tử Bitwise javascript để đạt được điều đó.

+0

Thực sự khá thú vị khi thấy lý do tại sao '(uint8) (num & 0xFF000000) >> 24' hoạt động cho ví dụ 'num = 0xF0000000': Toán tử >> chuyển đổi toán hạng của nó thành 32-bit hai bổ sung, do đó' 0xF0000000' tràn vào '-0x0FFFFFFF' được dịch chuyển sang' -0x0F'. Uint8Array sau đó chuyển các giá trị của nó thành các số nguyên 8 bit không dấu bằng cách lấy '-0x0F' modulo' 0xFF' (modulo ở đây KHÔNG phải là toán tử '%' nhưng luôn trả về kết quả dương theo thông số JS). Kết quả của điều đó cuối cùng là '0xF0', như mong đợi. Sẽ là một câu hỏi phỏng vấn tốt đẹp;) –

1

Câu trả lời của SEIAROTg không xuất ra chuỗi. Tôi đã thử nghiệm kỹ lưỡng với cả số dương và âm và mã này sẽ cung cấp cho bạn một chuỗi 4 byte đầu ra đại diện cho số ở định dạng endien lớn (2 lời khen 0xFFFFFFFF = -1).

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

bằng cách này nếu bạn muốn đi theo con đường khác xung quanh bạn có thể sử dụng

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

để chuyển đổi một chuỗi 4 byte để một số nguyên

+0

Đó là một giới hạn javascript. Javascript xem xét bất kỳ số 32 bit nào có chữ số đầu tiên là 1 số âm. –

+0

Tôi đã đưa ra giả định sai về mã của bạn. Câu trả lời của bạn đang làm việc tốt cho * đối số tiêu cực và tích cực * miễn là chúng nằm trong phạm vi (* ký *) số nguyên 32 bit. Tôi sẽ xóa nhận xét của mình, xin lỗi vì sự nhầm lẫn –

Các vấn đề liên quan