求助修复JavaScript中Int32转IPv4函数:部分测试用例报错
将无符号32位整数转换为IPv4地址的代码修复
需求说明
IPv4地址由4个8位字节(octet)组成,共32位,因此可通过无符号32位整数表示。需实现函数int32ToIp,输入无符号32位整数,返回对应的IPv4字符串格式,示例:
- 输入
2149583361,返回"128.32.10.1" - 输入
32,返回"0.0.0.32" - 输入
0,返回"0.0.0.0"
原代码问题
以下是用户实现的代码,部分测试用例可运行,但处理1069972272时出错,核心问题是二进制字符串分割顺序错误,且未补前导0到32位,导致短二进制字符串分割出空值,同时段顺序与IPv4要求相反:
function int32ToIp(int32){ let binaryNumber = int32.toString(2); let buffer = []; let result = []; let i = 8; for (let index = 0; index < 4; index++) { buffer[index] = binaryNumber.slice(i - 8,i); i += 8; if(!buffer[index]) { buffer[index] = '0'; } } for (let i = 0; i < buffer.length; i++) { result[i] = parseInt(buffer[i], 2); } return result.toString().replace(/,/g, '.'); }
修复方案
提供两种可靠的修复方式:
方案1:修正字符串处理逻辑
先将二进制字符串补前导0至32位,再从左到右按8位分割,确保段顺序和长度正确:
function int32ToIp(int32) { // 转换为二进制并补前导0,确保总长度为32位 const binary32 = int32.toString(2).padStart(32, '0'); const segments = []; // 从左到右每8位分割一段 for (let i = 0; i < 32; i += 8) { segments.push(binary32.slice(i, i + 8)); } // 转换为十进制后用点连接 return segments.map(seg => parseInt(seg, 2)).join('.'); }
方案2:位运算实现(更高效)
无需字符串处理,直接通过移位和掩码提取每个字节,避免补0和分割的问题:
function int32ToIp(int32) { // 依次提取四个8位字节(从高位到低位) const octet1 = (int32 >> 24) & 0xFF; const octet2 = (int32 >> 16) & 0xFF; const octet3 = (int32 >> 8) & 0xFF; const octet4 = int32 & 0xFF; return `${octet1}.${octet2}.${octet3}.${octet4}`; }
位运算说明:
>> n:将整数右移n位,把目标字节移到最低8位& 0xFF:保留低8位的值,避免JavaScript有符号整数的符号扩展问题,确保得到正确的无符号字节值
验证结果
修复后的代码可正确处理所有测试用例:
- 输入
2149583361→128.32.10.1 - 输入
32→0.0.0.32 - 输入
0→0.0.0.0 - 输入
1069972272→64.26.66.224
内容的提问来源于stack exchange,提问作者Andrey Smith
相关产品推荐
相关产品推荐

