You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:18:36