首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-hex函数

  • 25-03-03 04:30
  • 2023
  • 7602
blog.csdn.net

目录

一、hex函数常见的应用场景:

二、hex函数使用注意事项:

1、hex函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 



一、hex函数常见的应用场景:

        hex函数在 Python 中有多个实际应用场景,特别是在处理数字转换和格式化输出时,常见的应用场景有:

1、调试与日志记录:在开发过程中,经常需要打印变量的值以进行调试。对于整数变量,使用 hex()函数可以将其转换为十六进制形式,这在某些情况下可能更易于阅读和解释,尤其是当处理较大的数字或特定的位模式时。

2、位操作与底层编程:在处理与位操作相关的底层编程任务时,十六进制表示非常有用。例如,在硬件接口、网络通信或低级系统编程中,数据通常以字节或位的集合表示,而十六进制提供了一种紧凑且易于理解的方式来表示这些数据。

3、加密与哈希:在加密和哈希算法中,经常需要处理大量的二进制数据。hex()函数可以将这些二进制数据转换为十六进制字符串,使其更易于处理和比较。

4、网络通信:在网络通信中,数据通常以字节流的形式传输,当需要解析或构建这些字节流时,hex()函数可以帮助将整数形式的字节转换为十六进制字符串,从而更容易地理解数据的结构和内容。

5、颜色表示:在图形和图像处理中,颜色通常使用 RGB(红绿蓝)值表示,每个分量的范围通常是 0 到 255,这些值可以很容易地转换为十六进制形式,以便在 HTML、CSS 或其他标记语言中表示颜色。

6、格式化输出:使用字符串格式化功能,可以更灵活地控制十六进制字符串的输出格式。

7、进制运算与转换:虽然 hex()本身只负责转换,但你可以在转换后进行十六进制运算。此外,十六进制与其他进制之间可以相互转换。

        总之,在处理任何需要将整数转换为十六进制字符串的场合时,都可以使用hex()函数。

 

二、hex函数使用注意事项:

        在Python中使用hex()函数时,需注意以下事项:

1、输入类型:hex()函数只接受整数类型的参数,如果你尝试将一个非整数类型的值(如字符串、浮点数、列表等)传递给hex()函数,Python将抛出一个TypeError。

2、结果类型:hex()函数返回的是一个字符串,而不是一个整数,这个字符串以0x开头,后面跟着输入整数的十六进制表示。

3、负数处理:当hex()函数处理负数时,它实际上会先将这个负数转换为其正数形式的二进制补码表示,然后再将这个补码转换为十六进制字符串。因此,返回的十六进制字符串表示的是这个负数的补码形式,而不是直接表示这个负数的数值。如果你想去掉这个负号,可以简单地对返回的字符串进行切片操作。

4、大小写:hex()函数返回的十六进制字符串中的字母默认是小写(即`a`到`f`),如果你需要大写字母(即`A`到`F`),可以使用字符串的upper()方法将结果转换为大写。

5、前缀处理:在某些情况下,你可能不需要0x前缀,如果你想去掉这个前缀,可以使用字符串切片操作。

6、性能考虑:虽然hex()函数在处理单个整数时性能很好,但如果你需要对大量整数进行十六进制转换,并且关心性能,可能需要考虑其他方法,如自定义的转换函数或使用NumPy等库进行矢量化操作。

7、精度与截断:由于hex()函数仅处理整数,任何浮点数的小数部分都将被丢弃,这意味着,如果你有一个浮点数并期望其小数部分以某种方式在十六进制字符串中表示,这是不可能的。你需要先决定如何处理小数部分(例如,通过四舍五入、截断或乘以某个因子来转换为整数)。

        总之,记住这些注意事项可以帮助你正确、有效地使用Python中的hex()函数。

1、hex函数:
1-1、Python:
  1. # 1.函数:hex
  2. # 2.功能:将整数转换为带"0x"前缀的小写十六进制数字符串
  3. # 3.语法:hex(x)
  4. # 4.参数:x,表示要转换的整数,即正整数、负整数和零
  5. # 5.返回值:返回一个以0x开头的十六进制字符串
  6. # 6.说明:
  7. # 7.示例:
  8. # 应用1:调试与日志记录
  9. # 一个整数
  10. num = 255
  11. # 使用hex()函数将其转换为十六进制字符串
  12. hex_string = hex(num)
  13. # 打印结果
  14. print(f"十六进制表示: {hex_string}")
  15. # 十六进制表示: 0xff
  16. # 调试二进制数据
  17. # 一些二进制数据
  18. binary_data = bytes([0x03, 0x05, 0x06, 0x08])
  19. # 使用hex()函数和格式化字符串来显示每个字节的十六进制表示
  20. for byte in binary_data:
  21. print(f"字节: {byte} (十六进制: {hex(byte)})")
  22. # 字节: 3 (十六进制: 0x3)
  23. # 字节: 5 (十六进制: 0x5)
  24. # 字节: 6 (十六进制: 0x6)
  25. # 字节: 8 (十六进制: 0x8)
  26. # 日志记录
  27. import logging
  28. # 配置日志记录器
  29. logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
  30. # 一些二进制数据
  31. binary_data = bytes([0x12, 0x34, 0x56, 0x78])
  32. # 使用hex()函数和格式化字符串来记录每个字节的十六进制表示
  33. for byte in binary_data:
  34. logging.debug(f"字节: {byte} (十六进制: {hex(byte)})")
  35. # 2024-04-22 19:49:08,000 - DEBUG - 字节: 18 (十六进制: 0x12)
  36. # 2024-04-22 19:49:08,001 - DEBUG - 字节: 52 (十六进制: 0x34)
  37. # 2024-04-22 19:49:08,001 - DEBUG - 字节: 86 (十六进制: 0x56)
  38. # 2024-04-22 19:49:08,001 - DEBUG - 字节: 120 (十六进制: 0x78)
  39. # 应用2:位操作与底层编程
  40. # 位与操作
  41. # 定义两个整数
  42. a = 0b1100 # 二进制表示,即十进制的 12
  43. b = 0b1010 # 二进制表示,即十进制的 10
  44. # 执行位与操作
  45. result_and = a & b
  46. # 使用hex()函数将结果转换为十六进制字符串并打印
  47. print(f"a: {hex(a)}, b: {hex(b)}, a & b: {hex(result_and)}")
  48. # a: 0xc, b: 0xa, a & b: 0x8
  49. # 位或操作
  50. # 定义两个整数
  51. a = 0b1100 # 二进制表示,即十进制的 12
  52. b = 0b1010 # 二进制表示,即十进制的 10
  53. # 执行位或操作
  54. result_or = a | b
  55. # 使用hex()函数将结果转换为十六进制字符串并打印
  56. print(f"a: {hex(a)}, b: {hex(b)}, a | b: {hex(result_or)}")
  57. # a: 0xc, b: 0xa, a | b: 0xe
  58. # 位异或操作
  59. # 定义两个整数
  60. a = 0b1100 # 二进制表示,即十进制的 12
  61. b = 0b1010 # 二进制表示,即十进制的 10
  62. # 执行位异或操作
  63. result_xor = a ^ b
  64. # 使用hex()函数将结果转换为十六进制字符串并打印
  65. print(f"a: {hex(a)}, b: {hex(b)}, a ^ b: {hex(result_xor)}")
  66. # a: 0xc, b: 0xa, a ^ b: 0x6
  67. # 位移操作
  68. # 定义一个整数
  69. num = 0b1000 # 二进制表示,即十进制的 8
  70. # 左移操作
  71. result_left_shift = num << 2 # 左移两位
  72. # 右移操作
  73. result_right_shift = num >> 1 # 右移一位
  74. # 使用hex()函数将结果转换为十六进制字符串并打印
  75. print(f"num: {hex(num)}, num << 2: {hex(result_left_shift)}, num >> 1: {hex(result_right_shift)}")
  76. # num: 0x8, num << 2: 0x20, num >> 1: 0x4
  77. # 应用3:加密与哈希
  78. # 使用hashlib进行哈希
  79. import hashlib
  80. # 定义要哈希的数据
  81. data = b"Hello, Python!"
  82. # 创建哈希对象
  83. hasher = hashlib.sha256()
  84. # 更新哈希对象的内容
  85. hasher.update(data)
  86. # 获取哈希值(原始字节)
  87. hash_value_bytes = hasher.digest()
  88. # 使用hex()函数将哈希值转换为十六进制字符串
  89. hash_value_hex = hex(int.from_bytes(hash_value_bytes, byteorder='big'))
  90. # 打印结果
  91. print(f"哈希值(十六进制): {hash_value_hex}")
  92. # 哈希值(十六进制): 0x1c68755fc075a6bb08a82e80a5f1d3c8a8d40086a73cd8195ec7c43a7554f188
  93. # 使用cryptography进行加密
  94. from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
  95. from cryptography.hazmat.backends import default_backend
  96. from cryptography.hazmat.primitives import padding
  97. from cryptography.fernet import Fernet
  98. # 加密数据
  99. key = Fernet.generate_key() # 生成一个加密密钥
  100. cipher_suite = Fernet(key) # 使用Fernet算法和密钥创建一个cipher_suite对象
  101. # 要加密的数据
  102. data = b"This is a secret message."
  103. # 加密数据
  104. cipher_text = cipher_suite.encrypt(data)
  105. # 使用hex()函数将加密数据转换为十六进制字符串(通常不这么做,因为这会丢失加密数据的二进制结构)
  106. cipher_text_hex = cipher_text.hex() # 注意:这通常不是个好主意,因为它改变了数据的二进制结构
  107. # 打印加密数据的十六进制表示(仅用于示例)
  108. print(f"加密数据(十六进制): {cipher_text_hex}")
  109. # 解密数据
  110. plain_text = cipher_suite.decrypt(cipher_text)
  111. # 打印解密后的数据
  112. print(f"解密后的数据: {plain_text}")
  113. # 加密数据(十六进制): 674141414141426d4a6c474d5568736e6b4e7447563668516e35676e4469524d52506c4957424c37364c3459776365467079
  114. # 495f787937476169544d755166364e674f7773344479586476434c32364b67316f397146383754567654727173704a4a666f355670336b325a377
  115. # 73050754a6b6c48394d733d
  116. # 解密后的数据: b'This is a secret message.'
  117. # 应用4:网络通信
  118. # 将整数转换为十六进制
  119. # 一个整数
  120. num = 255
  121. # 使用hex函数转换为十六进制
  122. hex_num = hex(num)
  123. print(f"整数{num}的十六进制表示为:{hex_num}")
  124. # 整数255的十六进制表示为:0xff
  125. # 处理字节数据
  126. # 字节数据
  127. byte_data = b'\x01\x02\x03\x04'
  128. # 使用bytes.hex()方法转换为十六进制字符串
  129. hex_string = byte_data.hex()
  130. print(f"字节数据 {byte_data} 的十六进制表示为:{hex_string}")
  131. # 字节数据 b'\x01\x02\x03\x04' 的十六进制表示为:01020304
  132. # 从十六进制字符串恢复字节数据
  133. # 十六进制字符串
  134. hex_string = '01020304'
  135. # 使用bytes.fromhex()方法恢复字节数据
  136. byte_data = bytes.fromhex(hex_string)
  137. print(f"十六进制字符串 {hex_string} 对应的字节数据为:{byte_data}")
  138. # 十六进制字符串 01020304 对应的字节数据为:b'\x01\x02\x03\x04'
  139. # 处理网络数据包中的字节数据
  140. # 假设的网络数据包
  141. packet = b'\x12\x34\x56\x78\xab\xcd\xef'
  142. # 我们想要查看前四个字节的十六进制表示
  143. hex_part = packet[:4].hex()
  144. print(f"数据包的前四个字节的十六进制表示为:{hex_part}")
  145. # 数据包的前四个字节的十六进制表示为:12345678
  146. # 应用5:颜色表示
  147. # 十六进制颜色字符串的创建与解析
  148. # 定义一个RGB颜色的十六进制表示
  149. hex_color = '#FF0000' # 红色
  150. # 解析十六进制颜色字符串为RGB分量
  151. def hex_to_rgb(hex_color):
  152. hex_color = hex_color.lstrip('#')
  153. rgb = tuple(int(hex_color[i:i + 2], 16) for i in (0, 2, 4))
  154. return rgb
  155. # 使用函数解析颜色
  156. rgb_values = hex_to_rgb(hex_color)
  157. print(f"十六进制颜色 {hex_color} 对应的RGB值为:{rgb_values}")
  158. # 十六进制颜色 #FF0000 对应的RGB值为:(255, 0, 0)
  159. # 从RGB分量创建十六进制颜色字符串
  160. # 定义RGB颜色分量
  161. r, g, b = 255, 0, 0 # 红色
  162. # 将RGB分量转换为十六进制颜色字符串
  163. def rgb_to_hex(r, g, b):
  164. return '#{:02x}{:02x}{:02x}'.format(r, g, b)
  165. # 使用函数创建十六进制颜色字符串
  166. hex_color = rgb_to_hex(r, g, b)
  167. print(f"RGB值 {r}, {g}, {b} 对应的十六进制颜色为:{hex_color}")
  168. # RGB值 255, 0, 0 对应的十六进制颜色为:#ff0000
  169. # 使用十六进制颜色设置图形界面的颜色
  170. import tkinter as tk
  171. # 创建Tkinter窗口
  172. root = tk.Tk()
  173. root.title("Hex Color Example")
  174. # 定义十六进制颜色
  175. hex_color = '#00FF00' # 绿色
  176. # 创建一个标签,并使用十六进制颜色设置其背景色
  177. label = tk.Label(root, text="Hello, Python!", bg=hex_color, fg='black')
  178. label.pack(pady=20, padx=20)
  179. # 运行Tkinter事件循环
  180. root.mainloop()
  181. # 应用6:格式化输出
  182. # 直接输出十六进制表示
  183. # 一个整数
  184. num = 255
  185. # 使用hex()函数并格式化输出
  186. print(f"整数 {num} 的十六进制表示为:{hex(num)}")
  187. # 整数 255 的十六进制表示为:0xff
  188. # 格式化十六进制输出的长度
  189. # 一个整数
  190. num = 15
  191. # 使用hex()函数,并通过格式化控制输出长度
  192. hex_str = hex(num)[2:].zfill(2) # 去除'0x'前缀,并使用zfill填充到指定长度
  193. print(f"整数 {num} 的两位十六进制表示为:{hex_str}")
  194. # 整数 15 的两位十六进制表示为:0f
  195. # 格式化输出多个十六进制数
  196. # 一组整数
  197. nums = [10, 24, 3, 5, 6, 8, 11]
  198. # 遍历整数列表并输出它们的十六进制表示
  199. for num in nums:
  200. hex_num = hex(num)
  201. print(f"整数 {num} 的十六进制表示为:{hex_num}")
  202. # 整数 10 的十六进制表示为:0xa
  203. # 整数 24 的十六进制表示为:0x18
  204. # 整数 3 的十六进制表示为:0x3
  205. # 整数 5 的十六进制表示为:0x5
  206. # 整数 6 的十六进制表示为:0x6
  207. # 整数 8 的十六进制表示为:0x8
  208. # 整数 11 的十六进制表示为:0xb
  209. # 使用f-string进行格式化
  210. # 一个整数
  211. num = 123
  212. # 使用f-string进行格式化输出
  213. print(f"整数 {num} 的十六进制表示为:{hex(num).upper()}") # 转换为大写
  214. # 整数 123 的十六进制表示为:0X7B
  215. # 在输出中包含其他信息
  216. # 一个整数和它的描述
  217. num = 255
  218. description = "最大8位无符号整数值"
  219. # 输出整数、描述和它的十六进制表示
  220. print(f"整数 {num}({description})的十六进制表示为:{hex(num)}")
  221. # 整数 255(最大8位无符号整数值)的十六进制表示为:0xff
  222. # 应用7:进制运算与转换
  223. # 十进制到十六进制的转换
  224. # 一个十进制数
  225. decimal_num = 255
  226. # 使用hex()函数转换为十六进制字符串
  227. hex_num = hex(decimal_num)
  228. print(f"十进制数 {decimal_num} 的十六进制表示为:{hex_num}")
  229. # 十进制数 255 的十六进制表示为:0xff
  230. # 十六进制到十进制的转换
  231. # 一个十六进制字符串
  232. hex_str = 'ff'
  233. # 使用int函数和基数16将十六进制字符串转换为十进制数
  234. decimal_num = int(hex_str, 16)
  235. print(f"十六进制数 {hex_str} 的十进制表示为:{decimal_num}")
  236. # 十六进制数 ff 的十进制表示为:255
  237. # 进制之间的运算
  238. # 两个十六进制数相加
  239. hex_num1 = 'a'
  240. hex_num2 = 'f'
  241. # 转换为十进制进行加法运算
  242. decimal_sum = int(hex_num1, 16) + int(hex_num2, 16)
  243. # 将结果转换回十六进制
  244. hex_sum = hex(decimal_sum)[2:].upper() # 去除'0x'前缀并转换为大写
  245. print(f"十六进制数 {hex_num1} 加上 {hex_num2} 等于 {hex_sum}")
  246. # 十六进制数 a 加上 f 等于 19
1-2、VBA:
略,待后补。
2、推荐阅读:

1、Python-VBA函数之旅-help()函数

Python算法之旅:Algorithm

Python函数之旅:Functions 

个人主页:神奇夜光杯-CSDN博客 
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60609 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/138087936"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top