当前位置:网站首页>十六进制文本的字节序问题
十六进制文本的字节序问题
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); // 逆字节序
边栏推荐
猜你喜欢
VSTO踩坑记录(1)- 从零开始开发outlook插件
【C语言刷题】牛客JZ65——不用四则运算作加法
selenium installation and environment configuration firefox
什么是会话劫持以及如何阻止它
Mobile Banking Experience Test: How to Get the Real User Experience
Openharmony - 基于ArkUI(TS)开发颜色选择器
共享平台如何提高财务的分账记账效率?
Win11主题下载一直转圈怎么办?Win11主题下载一直转圈的解决方法
安装Mac版Mysql卡在Installation阶段,彻底清理mysql并重装mysql
我靠这套笔记自学,拿下字节50万offer....
随机推荐
JVM内存和垃圾回收-03.运行时数据区概述及线程
LeetCode 2349. 设计数字容器系统(SortedSet)
NIO基础之三大组件
Technical life | How to draw a big picture of business
Sentinel vs Hystrix 限流对比,到底怎么选?
力扣 622. 设计循环队列
阿里35+老测试员生涯回顾,自动化测试真的有这么吃香吗?
论文阅读_胶囊网络CapsNet
MySQL详细安装与配置
洛谷P1502 窗口的星星
注释
SQL Alias Aliases
VSTO踩坑记录(1)- 从零开始开发outlook插件
开源一夏 | Web开发(七):登录实现及功能测试
Boyun Selected as Gartner China DevOps Representative Vendor
AI智能剪辑,仅需2秒一键提取精彩片段
Endanger the safety of common Internet attacks have?
流量分析第二题
回收站删除的文件怎么恢复,2个方法汇总助您快速解决
cache2go-源码阅读