Golang IPv4 字符串与整数互转

本文介绍了如何在Go语言中将IPv4地址字符串转换为整数(uint32),并以大端对齐方式存储。反之,也展示了将整数表示的IPv4地址转换回字符串的过程。通过移位操作和格式化输出,实现IPv4地址的双向转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 字符串转整数

第一步是使用 net.ParseIP 判断字符串是否是合法的 IPv4 地址。如果合法,net.ParseIP 会将其转换成字符数组([]byte)。

第二步是使用 binary.Read 方法将上面的字符数组以大端对齐的方式写入 ret 变量中。

func InetAddr(ipaddr string) uint32 {
	var ret uint32

	ip := net.ParseIP(ipaddr)
	if ip == nil {
		return 0
	}

	if err := binary.Read(bytes.NewBuffer(ip.To4()), binary.BigEndian, &ret); err != nil {
		return 0
	}

	return ret
}

2. 整数转字符串

整数转字符串比较简单,以一个例子来演示:

有 IPv4 地址十六进制整数表示形式为 0x01020304,将其分别移位24、16、8、0后,会得到 IP 地址字符串表示形式的 4 段:

byte(0x01020304 >> 24) = byte(0x01)           = 1

byte(0x01020304 >> 16) = byte(0x0102)       = 2

byte(0x01020304 >> 8) = byte(0x010203)     = 3

byte(0x01020304 >> 0) = byte(0x01020304) = 4

将这四个值用 . 拼接后,即可得到字符串表式:1.2.3.4

func IPv4Uint32ToString(ip uint32) string {
    return fmt.Sprintf("%d.%d.%d.%d", byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip))
}

注意:byte 在强制转换大于其存储最大值时(0xff)时会溢出,会将左边部分丢弃。

### 字符串整数的方法及其实现 #### Go语言中的字符串整数转换 Go语言提供了`strconv`包来进行字符串其他数据类型的转换。其中,常用的函数有`Atoi()`和`ParseInt()`。 - `Atoi(s string)` 将字符串`s`解析为一个十进制的整数并返回对应的`int`值以及错误信息。如果输入不是有效的数字,则会返回错误[^1]。 - 示例代码如下: ```go package main import ( "fmt" "strconv" ) func main() { str := "12345" num, err := strconv.Atoi(str) if err != nil { fmt.Println("Conversion failed:", err) } else { fmt.Printf("The integer value is %d\n", num) } } ``` #### PHP中的字符串整数转换 PHP提供了一个简单的内置函数`intval()`来完成这一操作。该函数尝试将传入的参数化为整型。需要注意的是,当无法正确化时,默认返回0[^2]。 - 下面是一个例子展示如何使用`intval()`函数: ```php <?php $stringValue = "456"; $intValue = intval($stringValue); echo $intValue; // 输出 456 ?> ``` #### C/C++中的IP地址字符串整数转换 对于更复杂的场景比如处理IPv4地址(形如“192.168.1.1”),可以通过特定算法将其映射为单一的32位无符号整数表示形式。具体做法是把每一段用`.`分隔开的部分视为独立字节,并按顺序组合起来形成最终的结果[^3]。 下面给出了一种可能实现方法: ```cpp #include <iostream> #include <sstream> using namespace std; unsigned int ipStrToUint(const char* ipAddress){ unsigned int result=0; stringstream ss(ipAddress); string segment; for(int shift=24;ss>>segment && shift>=0;shift-=8){ result |= (stoi(segment)<<shift); if(ss.peek()=='.') ss.ignore(); } return result; } int main(){ const char *ip="192.168.1.1"; cout<<hex<<ipStrToUint(ip); // 可能输出 c0a80101 对应于十六进制下的 IP 地址 return 0; } ``` #### 总结 不同编程语言有不同的机制支持从字符串整数的数据类型变过程。无论是通过标准库还是自定义逻辑编写辅助工具类/函数都可以达到目的。以上分别介绍了Golang、PHP以及C++环境下几种常见途径及其实际应用案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值