当前位置:网站首页>十六进制文本的字节序问题
十六进制文本的字节序问题
2022-08-02 18:42:00 【字母数字或汉字】
给定一个十六进制字符串,要将其转换为 uint64,即使是使用语言自带的类库,也可能遇到暗含的字节序问题。
import sysdef foo(s): b = bytearray.fromhex(s) return int.from_bytes(b, sys.byteorder)def bar(s): return int(s, 16)h = '0000000000000001'print(foo(h), bar(h)) # (72057594037927936, 1)
对应的 C# 代码是
private static UInt64 foo(string s) { var b = Convert.FromHexString(s); return BitConverter.ToUInt64(b);}private static UInt64 bar(string s) { return Convert.ToUInt64(s, 16);}
这些语言类库都做了一个假设,当我们直接把字符串 0001
作为十六进制转换成十进制时,是按“大端序”来解析的,其结果在小端序的机器上的字节顺序是 01 00
。
当 0001
是一个字节数组时,其字节顺序被固定为 00 01
,因此再将其按位直译成数字(不做解析),在小端序上就表示数字 0x00 + 0x01*256 == 256
。
当然,语言类库也都提供了各种参数/方法来逆字节序:
b = bytearray.fromhex(s)# b.reverse() # 逆字节序return int.from_bytes(b, 'big') # 假设本机是 little,逆一次字节序
var b = Convert.FromHexString(s);// Array.Reverse(b); // 逆字节序return BitConverter.ToUInt64(b);// return BinaryPrimitives.ReverseEndianness(x); // 逆字节序
边栏推荐
猜你喜欢
Endanger the safety of common Internet attacks have?
如何获取EasyCVR平台设备通道的RTMP视频流地址?
3 and a half years of testing experience, I don't have 20K, it seems it's time to change jobs
阿里测试8年经验,靠着这份理解,我才得以生存下来
LeetCode 1947. 最大兼容性评分和(状态枚举DP)
【C语言刷题】双指针原地修改数组(力扣原题分析)
小姐姐面试蚂蚁金服被虐经历,心疼...
arcgis 分子式标注
【C语言刷题】Leetcode203——移除链表元素
【C语言刷题】牛客JZ65——不用四则运算作加法
随机推荐
去年,一道蚂蚁金服笔试题,还行,中等难度
深度学习-学习笔记(持续更新)
[深入研究4G/5G/6G专题-49]: 5G Link Adaption链路自适应-5-上行链路自适应ULLA-PUSCH信道
二本 两年经验读者 阿里P6面经
音频隐写一
新公链时代的跨链安全性解决方案
注释
快手web did可用生成
mongodb的游标
Openharmony - 基于ArkUI(TS)开发颜色选择器
力扣 622. 设计循环队列
Win11主题下载一直转圈怎么办?Win11主题下载一直转圈的解决方法
中职网络安全竞赛之应用服务漏洞扫描与利用
Technical life | How to draw a big picture of business
Golang sync/atomic 包的原子操作说明
针对时间的功能测试点,这里给你总结全面了
LeetCode 2353. 设计食物评分系统(sortedcontainers)
Jupyter Notebook(Anaconda)——两个环境分别修改默认打开目录(深度学习第一周番外篇)
实例034:调用函数
中国科学院院属研究单位