2014-06-09 40 views
0

由于某些原因,将字符串编码为字节,我想知道它是否是一个错误。请参见下面的代码:为什么要写000/s而不是字符串?

ip, _, err := net.ParseCIDR(cidr) 
if err!=nil{ 
    log.Panicf("can't parse cidr %s, err was %v", cidr, err) 
} 

type Ip struct{ 
    Ip string 
} 

ips := string(ip) 
j:= Ip{ 
    Ip: ips, 
} 
b, err := json.Marshal(j) 
if err != nil { 
    log.Printf("error:", err) 
} 

fmt.Fprintln(w, string(b)) 

它打印:

{"Ip":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ufffd\ufffd\ufffd\ufffd\u0007+"} 

我从EPEL软件库(红帽)运行围棋。我也做了一个返回类似结果的片段。

Play it for me!

回答

3

这是因为你是治疗的IP地址字节序列,作为原始字符串。

net.IP返回的值net.ParseCIDR有一个.String()方法你应该调用,而不是做string(ip)

尝试this代替:

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
    "net" 
) 

func main() { 
    cidr := "172.162.21.84/32" 

    ip, _, err := net.ParseCIDR(cidr) 
    if err != nil { 
     log.Panicf("can't parse cidr %s, err was %v", cidr, err) 
    } 

    type Ip struct { 
     Ip string 
    } 

    fmt.Printf("%T: %v\n", ip, ip) 

    j := Ip{ 
     Ip: ip.String(), 
    } 

    b, err := json.Marshal(j) 
    if err != nil { 
     log.Printf("error:", err) 
    } 

    fmt.Println(string(b)) 
} 
+0

我怎么知道?在goDoc上,我只能看到IP的类型是[]字节,所以我认为它只是一个字节片段。 – user3721073

+0

它是一个字节片段。但是这些字节是文字IP地址八位字节。字节值“255”不会打印为文字“255”字符串。该字符串将分别由3个字节组成,分别为ASCII字符'2','5'和'5'。 – jimt

相关问题