2014-11-29 02:58

# golang十进制到十六进制转换错误

Problem with precision

The setup is a physical i-button (1-wire specification) with printed hex value by manufacturer (trusted value). An IoT device encodes the binary as decminal - Golang returns the received value to Hex.

``````var V = 10736581604118680000
fmt.Sprintf("%016X", m.V)[2:14]) // adds uppercase and truncation of output
``````

provides `000015877CD1`

The expected trusted output is `000015877CD0`

the engraved Hex on the key is `95 000015877CD0 01`

http://www.rapidtables.com/convert/number/decimal-to-hex.htm (trusted?) indicates that the golang function used has lost precision. binary values that encode to 19 decimal digits can be converted to Hex by Golang without loss of precision (using function above)

#### 图片转代码服务由CSDN问答提供 功能建议

``` ``` var V =  10736581604118680000
fmt.Sprintf（“％016X”，mV）[2:14]）//添加大写和输出截断

提供了 000015877CD1 <  / code>

预期的可信输出为 000015877CD0

密钥上刻有十六进制的字符为 95 000015877CD0  01

http  ：//www.rapidtables.com/convert/number/decimal-to-hex.htm （受信任？）表示所使用的golang函数已失去精度。 可以使用Golang将编码为19个十进制数字的二进制值转换为十六进制，而不会损失精度（使用上述函数）
``````
` `
``` 点赞 写回答 关注问题 收藏 分享 邀请回答 ```
``` 1条回答 默认 最新 douzao2590 2014-11-29 03:56 已采纳 For example, package main import ( "fmt" "math/big" "strconv" ) func hexdec(s string) uint64 { d := uint64(0) for i := 0; i < len(s); i++ { x := uint64(s[i]) if x >= 'a' { x -= 'a' - 'A' } d1 := x - '0' if d1 > 9 { d1 = 10 + d1 - ('A' - '0') } if 0 > d1 || d1 > 15 { panic("hexdec") } d = (16 * d) + d1 } return d } func main() { x := "95000015877CD001" fmt.Println(x) n, err := strconv.ParseUint(x, 16, 64) fmt.Println(n, err) s := fmt.Sprintf("%016X", n)[2:14] fmt.Println(s) z, t := big.NewInt(0).SetString(x, 16) fmt.Println(z, t) s = fmt.Sprintf("%016X", z)[2:14] fmt.Println(s) fmt.Println(hexdec(x)) } Output: 95000015877CD001 10736581604118679553 <nil> 000015877CD0 10736581604118679553 true 000015877CD0 10736581604118679553 Note that you are near the limits of 64-bit integers: uint64 the set of all unsigned 64-bit integers (0 to 18446744073709551615) Where does Var V = 10736581604118680000 come from? The number 10736581604118680000 is a floating-point approximation (1.073658160411868e+19) of the integer 10736581604118679553. The manufacturer probably doesn't understand floating-point: What Every Computer Scientist Should Know About Floating-Point Arithmetic. Given the integer 10736581604118680000, Go calculates the correct result. Go is mathematically correct. So let's try telling Go that 10736581604118680000 is not an exact integer, that it's an approximate floating-point number. For example, package main import ( "fmt" "strconv" ) func main() { d := "10736581604118680000" f, err := strconv.ParseFloat(d, 64) fmt.Println(f, err) z := uint64(f) fmt.Println(z) s := fmt.Sprintf("%016X", z)[2:14] fmt.Println(s) } Output: 1.073658160411868e+19 <nil> 10736581604118679552 000015877CD0 While this trick works in this case, it's not guaranteed to work in all cases. The real solution is for the manufacturer to employ some competent mathematicians. I wonder what other bugs there are in their software and hardware. 点赞 打赏 评论 分享 报告相同问题？ 提交 关注问题 相关推荐 更多相似问题 golang十进制到十六进制转换错误 2014-11-29 02:58 回答 1 已采纳 For example, package main import ( "fmt" "math/big" "strconv" ) func hexdec(s strin Golang中十六进制的大数字 2016-12-25 21:33 回答 1 已采纳 Not sure what kind of issues are you having, but big.Int, big.Float and big.Rat implement the fmt. Golang十六进制编码 2014-05-27 14:39 回答 2 已采纳 As James Henstridge already mentioned the formatting you want (\x0b...) is not something that's re golang []byte存储存储的16进制转10进制 2019-05-15 21:42 蚂蚁飞行的博客 项目中有用[]byte存储16进制需要转到10进制，如果用系统自带的函数处理，需要先将[]byte通过hex.EncodeToString转为string，再用strconv.ParseInt转到10进制，过程复杂而且效率低。 自己写了一个函数来转： var b2m... Go语言基本语法 1 二进制八进制16进制 2018-04-28 13:45 孙小星的博客 八进制：逢八进一，数值有0,1,2,3,4,5,6,7十进制：逢十进一，数值有0,1,2,3,4,5,6,7,8,9十六进制：逢十六进一，数值有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F### 1.2 进制转换二进制、八进制、十六进制转为十进制十进制... 【Golang基础】三、进制及位运算 2021-04-08 19:59 Elked_Blog的博客 满8进1，以数字0开头 十六进制：0-9及A-F，满16进1，以0x或0X开头表示，此处的A-F不区分大小写 2.2、进制的转换 2.2.1、其他进制转十进制 二进制转十进制 八进制转十进制 十六进制转十进制 2.2.2、十进制转其他进制 ... Golang上的十六进制总和 2014-03-17 04:57 回答 4 已采纳 Intermernet's answer shows you how to convert a hexadecimal string into an int value. But your qu 将多个图像打包到GOLANG二进制文件中 2017-01-09 00:02 回答 1 已采纳 You could use the same tools you used for HTML files... I'm assuming you used something like: ht 在Golang中将控制信号转换为字节ASCII十六进制代码 websocket 2018-02-21 19:54 回答 1 已采纳 It sounds like you're trying to communicate a signal over a websocket. And thus you need a way to Golang 中的格式化输入输出 2016-03-16 12:30 破法者的博客 Golang 中的格式化输入输出   本文转自：http://zh.golanger.com/pkg/fmt/，并做了部分修改   【简介】 　fmt 包实现了格式化 I/O 函数，类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C，但比 C... golang的字符串和整数等转化工具包strconv 2018-02-12 19:09 m0_37579159的博客 https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter02/02.3.md2.3 strconv — 字符串和基本数据类型之间转换这里的基本数据类型包括：布尔、整型（包括有/无符号、二进制... golang从入门到成仙【day01】 2021-03-01 18:55 俞华的博客 day01 go build 在项目目录下执行go build 在其他路径下执行go build，需要在后面加上项目的路径(项目路径从...将可执行文件拷贝到GOPATH/bin 交叉编译（跨平台编译） Go支持跨平台编译 默认我们go build的可执行文件 Golang vs Python-十六进制字符串到整数 python 2019-07-05 19:05 回答 1 已采纳 This is a good question (though similar to another that Flimzy found). The main problem is that th Golang二进制文件可移植吗？ 2015-11-23 13:44 回答 1 已采纳 Yes it will; this is true of basically all binaries compiled for 64-bit Linux, not just those wri 在Golang中将二进制值作为字符串转换为uint32 2019-02-21 19:01 回答 2 已采纳 You can't use encoding/binary for this, as that is to serialize and deserialize the (memory) bytes golang 字符处理/转换/操作(string/byte/rune)大全 2020-06-20 01:00 BangBrother的博客 golang 字符处理/转换/操作stringstrings判断位置/数量替换分割连接strconvbytebytes中文或其他语言相关runeutf8扩展 string 字符串是golang的基本类型之一，也是常用的值类型。go的标准库有两个对字符串相关操作包... Go语言细节摘录 2019-11-15 10:18 痛苦鸭嘴笔的博客 可以看到，ParseInt在处理正负数时，判断标准仅仅是前面有没有带负号，而对于其他包括二进制、八进制、十六进制，首位最高位为1代表负数的形式，是不支持的。判断完符号，就调用ParseUint进行处理，得到结果会根据... [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习 2021-02-04 18:13 Eastmount的博客 因此从今天开始从零讲解Golang编程语言，一方面是督促自己不断前行且学习新知识；另一方面是分享与读者，希望大家一起进步。前文介绍了Golang的变量、数据类型和标识符知识，并通过12道编程练习进行提升。这篇文章将... 将int转换为十六进制字符串，然后在Golang中用0填充的有效方法？ 2017-10-21 07:06 回答 2 已采纳 strconv.AppendUint appears to be faster than fmt.Sprintf. For example, hex_test.go: package main 第五课 go语言基础-计算机进制转换和位运算 2020-01-21 00:42 道教儒佛电磁波的博客 第五课 go语言基础-计算机进制转换和位运算 tags: golang 2019尚硅谷 categories: golang 键盘输入 二进制 位运算和位移运算 文章目录第五课 go语言基础-计算机进制转换和位运算第一节 go语言键盘输入语句第二节... 没有解决我的问题, 去提问```
``` 点击登录 提问题 ◇ 欢迎建议意见 ◇ 回答问题能得到什么 ◇ 如何写高质量的提问和回答 ◇ 问答平台结题规则说明 加急问题 ¥101 文件对比，颜色标注，对比过程，形成字典 ¥100 namenode和datanode无法启动解决方案 ¥100 谁知道哪个app上面可以获取自己想要的链接。或者是购买链接 ¥100 求不定方程式整数解问题。 ¥100 yii2的advance版本使用yii2-rest-rbac的示例，认证方式oauth2 ¥100 使用https后，net4.6编译的web应用的oracle连接池异常，不能持续保持连接。但是在普通http协议下，oracle连接池是工作正常的，与oracle服务端的连接能持续。 ¥100 萌新求问会的朋友跑通这两个数据集 ¥100 高通平台camx相机驱动 ¥50 fortran中mkl库pardiso计算错误 ¥50 LS040T8LX02 夏普液晶玻璃的规格书！是玻璃规格书，不是模组的！ ```
``` ```
``` window.csdn.sideToolbar = { options: { afterFinished: function () { setTimeout(function () { var helphtml = '<a class="option-box" data-type="help" href="https://ask.csdn.net/questions/7441224" target="_blank">'+'<img src="https://g.csdnimg.cn/side-toolbar/2.5/images/bangzhucopy.png" alt="" srcset="">'+ '<span class="show-txt">帮助</span></a>'; \$('.csdn-side-toolbar > a:last').before(helphtml); }, 300); }, contentEl: document.getElementsByClassName('floor')[0] } } ```