Go语言字节序列、数字与字符串及其之间的互相转换

weiwg521 · 2018-11-24 19:32:39 · 2146 次点击 · 预计阅读时间 5 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-11-24 19:32:39 的文章,其中的信息可能已经有所发展或是发生改变。

#Go语言字节序列、数字与字符串及其之间的互相转换

int int64 uint uint64 float64 string []byte之间的转换

1 strconv包

实现了字符串和基本数据类型之间的转换。

1.1 int和string转换

 i, err := strconv.Atoi("-42") //string->int
s := strconv.Itoa(-82)        //int->string
fmt.Println("int<-->string:", i, err, s)
--------------------------------------
int<-->string: -42 <nil> -82

1.2 字符串转为数字

b, err := strconv.ParseBool("true")        //转为布尔值
f, err := strconv.ParseFloat("3.1415", 64) //转为64位浮点数
h, err := strconv.ParseInt("-42", 10, 64)  //转为10进制64位整数
u, err := strconv.ParseUint("42", 10, 64)  //转为10进制64位无符号整数
fmt.Println("string-->number:", b, f, h, u)
-----------------------------------------
string-->number: true 3.1415 -42 42

1.3 数字转为字符串

s1 := strconv.FormatBool(true)
s2 := strconv.FormatFloat(30.1415, 'E', 2, 64) //保留2位小数的科学计数法
s3 := strconv.FormatInt(-42, 16)               //转为16进制数表示的字符串
s4 := strconv.FormatUint(42, 2)                //转为2进制数表示的字符串
fmt.Println("number-->string:", s1, s2, s3, s4)
---------------------------------------------------
number-->string: true 3.01E+01 -2a 10000010101010011010100

1.4 字符串转换

p := strconv.Quote(`"Fran & Freddie's     Diner    ☺
              "`) //返回字符串,并用go转义序列表示其中的控制字符和不可打印字符
p1 := strconv.QuoteRune('    ') //返回单引号字符,转义同上
//返回单引号字符,用转义表示非ASCII字符和不可打印字符
p2 := strconv.QuoteRuneToASCII('☺')
//返回字符串的引用值,输入如"`Hello`",`"Hello"`,"'v'","\"Hello\""
p3, _ := strconv.Unquote("You can't unquote a string without quotes") //返回 ""
q := strconv.QuoteToASCII("Hello ,世界")
fmt.Println(p)
fmt.Println(p1, p2, p3, q)
-----------------------------------------------------------------
"\"Fran & Freddie's \tDiner\t☺\n\t\t\t  \""
'\t' '\u263a'  "Hello ,\u4e16\u754c"

2 fmt包实现格式化输出

2.1 类C语言的格式化输出

sf1 := fmt.Sprintf("%12.2f", -12.069) //总长度位12,2位小数,靠右对齐的字符串
sf2 := fmt.Sprintf("%-12.2f", 12.068) //总长度位12,2位小数,左对齐的字符串
sf3 := fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)
fmt.Println(sf1, sf2, sf3)
-------------------------------------
      -12.07
 12.07       
 16 17 0x10 0x11

3 encoding/binary包

主要用于数字和字节序列转换。Go语言中的int和uint类型依赖于平台可能是32/64位,是不固定位数的整数,很多函数不支持直接使用,需要转为int64或uint64使用

3.1数字的默认类型

var int1 = 123456            //默认为int类型数据,根据系统平台32/64
//如binary.Size(int1) 将返回-1 而binary.Size(int64(int1))返回4  
var int2 int64 = int64(int1) //两种类型需要强制转换
var flt1 = 123.4567          //默认float64
var int3 = int64(flt1)       //转为整数将截断小数部分
fmt.Printf("%T,%T,%T,%T\n", int1, int2, flt1, int3)
---------------------------------------
int,int64,float64,int64

3.2 int64和uint64与字节序列的转换

var len1 = binary.Size(int64(123525))          //字节长度
buf := make([]byte, binary.MaxVarintLen64)     //定义字节切片用于接收字节序列
len2 := binary.PutVarint(buf, int64(12312321)) //将int64转为字节序列
byts := buf[:len2]                             //有效的字节序列
res1, len3 := binary.Varint(buf)               //返回int64,有效长度
fmt.Println(len1, len2, buf, byts)
fmt.Println(res1, len3)
----------------------------------
8 4 [130 252 222 11 0 0 0 0 0 0] [130 252 222 11]
12312321 4

3.3 其它固定长度类型值与字节序列的转换

buff := new(bytes.Buffer) //可变长度的字节序列
var pi = math.Pi
    //只支持固定位类型即这里int/uint等必须转int64/uint64
err := binary.Write(buff, binary.LittleEndian, pi)
if err != nil {
    fmt.Println("binary.Write failed:", err)
}
fmt.Printf("% x,%d\n", buff.Bytes(), buff.Len())
------------------------------------
18 2d 44 54 fb 21 09 40,8

4 字符串和字节序列的转换

bts1 := []byte("hello,世界你好") //先切片再将元素转为byte
bts2 := []rune("hello,世界你好") //同上
fmt.Println("UTF-8:", string(bts1), bts1, len(bts1))
fmt.Println("Unicode:", string(bts2), bts2, len(bts2))
--------------------------------------
UTF-8: hello,世界你好 [104 101 108 108 111 44 228 184 150 231 149 140 228 189 160 229 165 189] 18
Unicode: hello,世界你好 [104 101 108 108 111 44 19990 30028 20320 22909] 10

5 math/big包

实现了任意精度的大数的数学运算,包括整数、浮点、有理数

a := big.NewInt(9999999999)                   //使用int64初始化大整数
b := big.NewInt(99999123456)                  //使用int64初始化大整数
mul := a.Mul(a, b).Exp(a, big.NewInt(5), nil) //大整数的乘法、乘方运算
fmt.Println(mul)
c := big.NewRat(int64(138040), int64(625)) //分数表示
fmt.Println(c, c.Inv(c))             //倒数
d := big.NewFloat(123568.12525)
d.MantExp(d)
fmt.Printf("%.50f", d)
-----------------------------------------
999982468996836444564233237013248329383936
125/27608 125/27608
0.94274997901916501863439634689711965620517730712891

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2146 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
1 回复  |  直到 2018-12-16 18:16:38
weiwg521
weiwg521 · #1 · 6年之前

1 将[]byte转为基本数字类型

b := []byte{0xe8, 0x03, 0xd0, 0x07}
x1 := binary.LittleEndian.Uint16(b[0:])
x2 := binary.LittleEndian.Uint16(b[2:])

2 将基本数字类型转为[]byte

b := make([]byte, 4)
binary.LittleEndian.PutUint16(b[0:], 0x03e8)
binary.LittleEndian.PutUint16(b[2:], 0x07d0)
fmt.Printf("% x\n", b)
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传