基础部分
进制转换:
1. 二进制转八进制 %b -> %o
2. 二进制转十进制 %b -> %d
3. 二进制转十六进制 %b -> %x
4. 八进制转二进制 %o -> %b
5. 八进制转十进制 %o -> %d
6. 八进制转十六进制 %o -> %x
7. 十进制转二进制 %d -> %b
8. 十进制转八进制 %d -> %o
9. 十进制转十六进制 %d -> %x
10. 十六进制转二进制 %x -> %b
11. 十六进制转八进制 %x -> %o
12. 十六进制转十进制 %x -> %d
// 例
fmt.Printf("十进制%d转成八进制%o",num1,num2)
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于"U+%04X"
%E 用科学计数法表示
%f 用浮点数表示
hex := fmt.Sprintf("%08x", i)
说明:hex是16进制,i是int类型,以上代码将i转为16进制,不足的部分前面加0,补足8位,%08x中的08表示补足到8位数。
// 二进制转十进制
func main(){
var num01 int = 0b1100
fmt.Printf("%b的十进制为%d", num01,num01)
}
// 八进制转十进制
func main(){
var num01 int = 0o10
fmt.Printf("%o的十进制为%d", num01,num01)
}
// 十六进制转十进制
func main(){
var num01 int = 0xf
fmt.Printf("%x的十进制为%d", num01,num01)
}
开发部分
服务端向设备发送升级文件:
流程:
设备发起升级请求-》服务器响应请求并读取升级文件放入数组-》
设备发起文件传输请求-》服务器传输文件
读取文件的坑:
通过os.OpenFile中的reader.ReadString按行读取文件,每行存在特殊空字符,如果要做其他处理,记得把空字符去掉!!!!!!!!!!!!!!!!!!!
// 从文件读取的存在非空字符,过滤非16进制字符
func filterNoHex(str string) (res string) {
reg, err := regexp.Compile("[^a-zA-Z0-9]+")
if err != nil {
logger.Error(err)
}
res = reg.ReplaceAllString(str, "")
return res
}
二进制文件是以冒号开头的,但转化为十六进制时,冒号会出错,需要将冒号去掉再转化。
文件数组存放的坑:
需要额外声明一个通道,第一次读取升级文件转化为数组并放入通道,下次设备再次请求传输文件时,将数组从通道取出,并读取响应行数返回给设备,之后得将数组再次放入通道,确保下次请求通道里有数据,否则会阻塞在通道处。