2013-04-02 39 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 *参数您的答案就可以正常工作。我会删除我的评论,对于混淆抱歉 –

相关问题