当前位置:   article > 正文

Python-VBA函数之旅-ascii函数

Python-VBA函数之旅-ascii函数

目录

1、ascii函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客

        ascii函数在Python中主要用于将对象(特别是字符和字符串)转换为它们的ASCII表示形式。这种转换在处理文本数据、调试代码以及确保文本以 ASCII 格式存储或传输时非常有用。常见应用场景有:

1、调试和文本处理:当处理包含非ASCII字符(如Unicode字符)的文本时,ascii()函数可以帮助你查看这些字符的ASCII表示形式。这对于识别和理解文本中的特殊字符或不可见字符(如控制字符)特别有用。

2、代码示例和文档:在编写代码示例或文档时,有时需要展示一个字符或字符串的ASCII表示。使用ascii()函数可以方便地生成这种表示,而无需手动编写转义序列。

3、数据清洗和规范化:在处理文本数据时,有时候需要将非ASCII字符替换为对应的ASCII字符,以便进行数据清洗和规范化。ascii()函数可以帮助我们实现这一目标,使得数据更易于处理和分析。

4、文本过滤和清理:如果你需要从文本中删除或替换非ASCII字符,可以使用ascii()函数结合其他字符串处理方法来实现。例如,你可以使用正则表达式结合ascii()函数来识别并处理非ASCII字符。

5、跨平台兼容性:在某些情况下,你可能需要确保文本数据在不同的平台或环境中都能正确解析。使用ascii()函数可以帮助你确保文本数据以兼容的方式表示,特别是在处理可能包含平台特定字符或编码的文本时。

6. 加密和解密:ASCII函数在某些简单的加密和解密算法中有所应用。通过将字符转换为ASCII码值,然后对这些值进行某种形式的变换(如位移、替换等),可以实现简单的加密。解密过程则是加密的逆操作,通过相同的变换将ASCII码值转换回字符。

7、网络编程:在编写涉及网络通信的代码时,有时需要确保发送或接收的数据只包含ASCII字符,因为某些协议或系统可能只支持ASCII字符集。在这种情况下,你可以使用ascii()函数来转换或验证数据。

        需要注意的是,ascii()函数主要用于获取对象的ASCII表示形式,而不是用于编码或解码文本数据。如果你需要将文本数据编码为ASCII格式并处理非ASCII字符(如替换或忽略它们),应该使用字符串的".encode()"方法,并指定适当的错误处理策略(如"ignore" 或 "replace")。

        此外,对于大多数现代应用来说,使用Unicode(通常是UTF-8编码)来处理文本数据更为常见和推荐,因为它支持更广泛的字符集和跨平台兼容性。但在某些特定场景下,ascii()函数仍然是一个有用的工具。

1、ascii函数:
1-1、Python:
  1. # 1.函数:ascii
  2. # 2.功能:将一个对象转换为其可打印的ASCII表示形式
  3. # 3.语法:ascii(object)
  4. # 4.参数:Python中主要的内置对象类型,包括但不限于以下类型:
  5. # 4-1、 数字类型:
  6. # - `int`(整型):用于表示整数,如 `1`, `100`, `-8080` 等
  7. # - `float`(浮点型):用于表示浮点数,即带小数点的数字,如 `1.23`, `0.0`, `-99.9` 等
  8. # - `complex`(复数型):用于表示复数,如 `3+6j`
  9. # 4-2、 序列类型:
  10. # - `list`(列表):有序的元素集合,元素之间用逗号分隔,整个列表由方括号包围。例如:`[1, 2, 3, 'a', 'b', 'c']`
  11. # - `tuple`(元组):与列表类似,但元素不能修改。例如:`(1, 2, 3)`
  12. # - `str`(字符串):字符序列。例如:`"Hello, world!"`
  13. # - `bytes`:字节序列,常用于处理二进制数据
  14. # - `bytearray`:可变字节序列
  15. # 4-3、 集合类型:
  16. # - `set`(集合):无序且不包含重复元素的集合。例如:`{1, 2, 3}`
  17. # - `frozenset`(冻结集合):不可变的集合,与set类似,但内容不能修改
  18. # 4-4、 映射类型:
  19. # - `dict`(字典):无序的键值对集合。例如:`{'name': 'myelsa', 'age': 43}`
  20. # 4-5、布尔类型:
  21. # - `bool`:布尔值,只有两个值 `True` 和 `False`
  22. # 4-6、 特殊类型:
  23. # - `NoneType`:只有一个值 `None`,表示空或无值的状态
  24. # - `ellipsis`:表示省略号对象,通常用三个点 `...` 表示
  25. # - `notimplemented`:一个特殊的单例值,当对象不支持某个操作时返回此值
  26. # 4-7、其他类型:
  27. # - `type`:用于表示类型对象本身
  28. # - `range`:表示一个不可变的数字序列范围
  29. # - `memoryview`:内存中的字节序列的“窗口”或“视图”
  30. # - `slice`:表示切片对象,用于在序列类型上切片
  31. # - `enum.Enum`(通过`enum`模块):枚举类型,表示一组具名的常量
  32. # - `functions`、`methods`、`class objects`、`instances` 等:函数、方法、类对象、实例对象等
  33. # - `module`:模块对象
  34. # - `file`:文件对象
  35. # - `traceback`、`frame` 和 `code` 对象:用于表示调用栈、帧和代码对象
  36. # 5.返回值:返回一个表示该对象的字符串,这个字符串包含对象的可打印ASCII字符的表示形式
  37. # 6.说明:
  38. # 6-1、使用ascii()函数时,要注意它只返回对象的可打印ASCII字符表示形式,并且不是所有对象都有有意义的ASCII表示
  39. # 6-2、ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
  40. # 7.示例:
  41. # 应用1:调试和文本处理
  42. def custom_ascii(s):
  43. # 将字符串转换为ASCII表示形式
  44. ascii_repr = ascii(s)
  45. # 添加调试信息
  46. debug_info = f"String length: {len(s)} \nASCII representation:{ascii_repr}"
  47. # 返回ASCII表示形式和调试信息
  48. return debug_info
  49. # 主函数
  50. if __name__ == '__main__':
  51. text = "人生苦短, 我用python!"
  52. ascii_debug_info = custom_ascii(text)
  53. print(ascii_debug_info)
  54. # String length: 15
  55. # ASCII representation:'\u4eba\u751f\u82e6\u77ed, \u6211\u7528python!'
  56. # 应用2:代码示例和文档
  57. def formatted_ascii(obj):
  58. """
  59. 返回对象的格式化ASCII表示形式,以便用于代码示例和文档。
  60. 参数:
  61. obj(any): 要转换的对象。
  62. 返回:
  63. str: 对象的格式化ASCII表示形式的字符串。
  64. """
  65. ascii_repr = ascii(obj)
  66. # 格式化ASCII字符串,比如添加换行符以便阅读
  67. formatted_repr = ascii_repr.replace("'", "").replace(",", ",\n ").strip()
  68. return formatted_repr
  69. # 主函数
  70. if __name__ == '__main__':
  71. example_list = [1, 2, 3, 'a', 'b', 'c']
  72. example_dict = {'name': 'myelsa', 'age': 43}
  73. # 使用formatted_ascii函数展示列表的ASCII表示
  74. print("列表的ASCII表示:")
  75. print(formatted_ascii(example_list))
  76. # 使用formatted_ascii函数展示字典的ASCII表示
  77. print("\n字典的ASCII表示:")
  78. print(formatted_ascii(example_dict))
  79. # 列表的ASCII表示:
  80. # [1,
  81. # 2,
  82. # 3,
  83. # a,
  84. # b,
  85. # c]
  86. #
  87. # 字典的ASCII表示:
  88. # {name: myelsa,
  89. # age: 43}
  90. # 应用3:数据清洗和规范化
  91. def custom_ascii(s, keep_ascii_only=False):
  92. # 如果keep_ascii_only为True,则只保留ASCII字符
  93. if keep_ascii_only:
  94. s = ''.join(c for c in s if ord(c) < 128)
  95. # 将字符串转换为ASCII表示形式
  96. ascii_repr = ascii(s)
  97. # 添加调试信息
  98. debug_info = f"Original string: {s} \nASCII-only string: {s if not keep_ascii_only else ''} \nASCII representation:{ascii_repr}"
  99. # 返回ASCII表示形式和调试信息
  100. return debug_info
  101. # 主函数
  102. if __name__ == '__main__':
  103. # 保留ASCII字符
  104. text_with_non_ascii = "人生苦短, 我用python!"
  105. ascii_debug_info_keep_ascii = custom_ascii(text_with_non_ascii, keep_ascii_only=True)
  106. print(ascii_debug_info_keep_ascii)
  107. # Original string: , python!
  108. # ASCII-only string:
  109. # ASCII representation:', python!'
  110. # 应用4:加密和解密
  111. def encrypt_with_ascii(plaintext, offset):
  112. """
  113. 使用ASCII值和给定的偏移量加密明文。
  114. 参数:
  115. plaintext(str): 要加密的明文。
  116. offset(int): 应用于每个字符ASCII值的偏移量。
  117. 返回:
  118. str: 加密后的密文。
  119. """
  120. # 初始化空字符串来保存加密后的字符
  121. ciphertext = ""
  122. # 遍历明文中的每个字符
  123. for char in plaintext:
  124. # 获取字符的ASCII值
  125. ascii_value = ord(char)
  126. # 应用偏移量
  127. encrypted_ascii_value = (ascii_value + offset) % 256 # 使用模运算来确保值在0-255之间
  128. # 将加密后的ASCII值转换回字符
  129. encrypted_char = chr(encrypted_ascii_value)
  130. # 将加密后的字符添加到密文字符串中
  131. ciphertext += encrypted_char
  132. return ciphertext
  133. # 主函数
  134. if __name__ == '__main__':
  135. plaintext = "Hello,Python!"
  136. offset = 43 # 可以选择任何整数作为偏移量
  137. # 加密明文
  138. encrypted_text = encrypt_with_ascii(plaintext, offset)
  139. print(f"加密后的文本: {encrypted_text}")
  140. # 解密密文需要知道相同的偏移量
  141. def decrypt_with_ascii(ciphertext, offset):
  142. """
  143. 使用相同的ASCII值和偏移量解密密文。
  144. 参数:
  145. ciphertext(str): 要解密的密文。
  146. offset(int): 用于加密的相同偏移量。
  147. 返回:
  148. str: 解密后的明文。
  149. """
  150. # 初始化空字符串来保存解密后的字符
  151. plaintext = ""
  152. # 遍历密文中的每个字符
  153. for char in ciphertext:
  154. # 获取字符的ASCII值
  155. ascii_value = ord(char)
  156. # 应用相反的偏移量来解密
  157. decrypted_ascii_value = (ascii_value - offset) % 256
  158. # 将解密后的ASCII值转换回字符
  159. decrypted_char = chr(decrypted_ascii_value)
  160. # 将解密后的字符添加到明文字符串中
  161. plaintext += decrypted_char
  162. return plaintext
  163. # 主函数
  164. if __name__ =='__main__':
  165. # 解密密文
  166. decrypted_text = decrypt_with_ascii(encrypted_text, offset)
  167. print(f"解密后的文本: {decrypted_text}")
  168. # 加密后的文本: sW{¤L
  169. # 解密后的文本: Hello,Python!
  170. # 应用5:网络编程
  171. def encode_to_ascii(data):
  172. """
  173. 将字符串编码为ASCII字节流。
  174. 参数:
  175. data(str): 要编码的字符串。
  176. 返回:
  177. bytes: 编码后的ASCII字节流。
  178. """
  179. # 使用'ascii'编码将字符串转换为字节流
  180. ascii_bytes = data.encode('ascii')
  181. return ascii_bytes
  182. # 主函数
  183. if __name__ == '__main__':
  184. text_to_send = "Hello, Python!"
  185. encoded_text = encode_to_ascii(text_to_send)
  186. print(f"Encoded text: {encoded_text}")
  187. def decode_from_ascii(data):
  188. """
  189. 将ASCII字节流解码为字符串。
  190. 参数:
  191. data(bytes): 要解码的ASCII字节流。
  192. 返回:
  193. str: 解码后的字符串。
  194. """
  195. # 使用'ascii'编码将字节流解码为字符串
  196. ascii_str = data.decode('ascii')
  197. return ascii_str
  198. # 主函数
  199. if __name__ == '__main__':
  200. received_data = b'Hello, Python!'
  201. decoded_text = decode_from_ascii(received_data)
  202. print(f"Decoded text: {decoded_text}")
  203. import socket
  204. def start_server():
  205. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  206. server_socket.bind(('localhost', 10248))
  207. server_socket.listen(1)
  208. print("Server started, listening on port 10248...")
  209. while True:
  210. client_socket, client_address = server_socket.accept()
  211. print(f"Connection from {client_address}")
  212. # 接收数据
  213. received_data = client_socket.recv(1024)
  214. decoded_text = decode_from_ascii(received_data)
  215. print(f"Received: {decoded_text}")
  216. # 发送响应
  217. response = "Message received!"
  218. encoded_response = encode_to_ascii(response)
  219. client_socket.sendall(encoded_response)
  220. client_socket.close()
  221. # 主函数
  222. if __name__ == "__main__":
  223. start_server()
  224. def start_client():
  225. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  226. client_socket.connect(('localhost', 10248))
  227. # 发送数据
  228. message = "Hello from client!"
  229. encoded_message = encode_to_ascii(message)
  230. client_socket.sendall(encoded_message)
  231. # 接收响应
  232. response_data = client_socket.recv(1024)
  233. decoded_response = decode_from_ascii(response_data)
  234. print(f"Received response: {decoded_response}")
  235. client_socket.close()
  236. # 主函数
  237. if __name__ == "__main__":
  238. start_client()
  239. # Encoded text: b'Hello, Python!'
  240. # Decoded text: Hello, Python!
  241. # Server started, listening on port 10248...
1-2、VBA
  1. ' 1.函数:Asc
  2. ' 2.功能:提取字符串中第一个字符的ASCII编码值
  3. ' 3.语法:Asc(string)
  4. ' 4.参数:
  5. ' 4-1、 string是必需的参数,表示要返回其ASCII值的字符或字符串表达式
  6. ' 4-2、 如果string包含多个字符,Asc函数仅返回第一个字符的ASCII值
  7. ' 5.返回值:一个整数,表示字符串中第一个字符的ASCII值.
  8. ' 6.说明:
  9. ' 6-1、如果字符串为空(""),则Asc函数返回0
  10. ' 6-2、Asc函数只能正确处理单字节字符集,如ANSI或默认的Windows代码页。对于双字节字符集(如Unicode),Asc函数可能无法正确返回预期的值,因为它只处理字符串的第一个字节
  11. ' 7.示例:
  12. '-----------------------------------------------------------------------------------------------------------------------------------------------------------------
  13. Rem 模拟Python中ascii函数应用1:调试和文本处理
  14. Function CustomAscii_1(s As String) As String
  15. Dim ascii_repr As String
  16. Dim debug_info As String
  17. Dim i As Integer
  18. ' 初始化调试信息
  19. debug_info = "String length: " & Len(s) & vbCrLf & "ASCII representation: "
  20. ' 遍历字符串的每个字符
  21. For i = 1 To Len(s)
  22. ' 获取字符的ASCII值,并添加到ascii_repr中
  23. ascii_repr = ascii_repr & vbCrLf & "Char: " & mid(s, i, 1) & " -> ASCII: " & Asc(mid(s, i, 1)) & vbCrLf
  24. Next i
  25. ' 拼接调试信息和ASCII表示形式
  26. CustomAscii_1 = debug_info & ascii_repr
  27. End Function
  28. Rem 执行程序,功能:调用自定义函数CustomAscii_1,实现文本信息处理
  29. Sub TestRun_1()
  30. Dim text As String
  31. Dim ascii_debug_info As String
  32. ' 输入的字符串
  33. text = "人生苦短,我用Python!"
  34. ' 调用CustomAscii函数
  35. ascii_debug_info = CustomAscii_1(text)
  36. ' 显示结果
  37. MsgBox ascii_debug_info, vbInformation, "文本处理"
  38. End Sub
  39. Rem 模拟Python中ascii函数应用2:数据清洗和规范化
  40. Function CustomAscii_2(s As String, keepAsciiOnly As Boolean) As String
  41. Dim originalString As String
  42. Dim asciiOnlyString As String
  43. Dim asciiRepr As String
  44. Dim debugInfo As String
  45. Dim i As Integer
  46. Dim c As String
  47. ' 保存原始字符串
  48. originalString = s
  49. ' 如果 keepAsciiOnly 为 True,则只保留 ASCII 字符
  50. If keepAsciiOnly Then
  51. asciiOnlyString = ""
  52. For i = 1 To Len(s)
  53. c = mid(s, i, 1)
  54. If AscW(c) < 128 Then
  55. asciiOnlyString = asciiOnlyString & c
  56. End If
  57. Next i
  58. Else
  59. asciiOnlyString = originalString
  60. End If
  61. ' VBA 没有内置的 ascii 函数来将整个字符串转换为 ASCII 表示形式
  62. ' 但我们可以手动构建一个字符串,将非 ASCII 字符替换为转义序列
  63. asciiRepr = ""
  64. For i = 1 To Len(originalString)
  65. c = mid(originalString, i, 1)
  66. If AscW(c) < 128 Then
  67. asciiRepr = asciiRepr & c
  68. Else
  69. ' 使用 VBA 的 ChrW 和 AscW 函数转换非 ASCII 字符为转义序列
  70. asciiRepr = asciiRepr & "\u" & Format(AscW(c), "X4")
  71. End If
  72. Next i
  73. ' 添加调试信息
  74. debugInfo = "Original string: " & originalString & vbCrLf & _
  75. "ASCII-only string: " & asciiOnlyString & vbCrLf & _
  76. "ASCII representation: " & asciiRepr
  77. ' 返回调试信息
  78. CustomAscii_2 = debugInfo
  79. End Function
  80. Rem 执行程序,功能:调用自定义函数CustomAscii_2,在立即窗口中输出结果
  81. Sub TestRun_2()
  82. Dim textWithNonAscii As String
  83. Dim asciiDebugInfoKeepAscii As String
  84. ' 示例文本包含非 ASCII 字符
  85. textWithNonAscii = "人生短暂,我用Python!" ' “苦”字的编码值超出127的范围,故将原来的“苦短”调整为“短暂”
  86. ' 调用 CustomAscii 函数,并保留 ASCII 字符
  87. asciiDebugInfoKeepAscii = CustomAscii_2(textWithNonAscii, True)
  88. ' 输出结果
  89. Debug.Print asciiDebugInfoKeepAscii
  90. End Sub
  91. 'Original string: 人生短暂,我用Python!
  92. 'ASCII-only string: ,Python!
  93. 'ASCII representation: \uX4\uX4\uX4\uX4,\uX4\uX4Python!
  94. Rem 模拟Python中ascii函数应用3:加密和解密
  95. Rem 加密函数,功能:将明文按照指定的偏移量加密为密文
  96. Function EncryptWithAscii(plaintext As String, offset As Integer) As String
  97. Dim ciphertext As String ' 初始化用于存储加密后文本的变量
  98. Dim char As String ' 用于临时存储每个字符的变量
  99. Dim asciiValue As Integer ' 用于存储字符的ASCII值的变量
  100. Dim encryptedAsciiValue As Integer ' 用于存储加密后的ASCII值的变量
  101. ciphertext = "" ' 初始化密文为空字符串
  102. ' 遍历明文中的每个字符
  103. For i = 1 To Len(plaintext)
  104. ' 提取明文中的第i个字符
  105. char = mid(plaintext, i, 1)
  106. ' 获取字符的Unicode(ASCII)值
  107. asciiValue = AscW(char)
  108. ' 将字符的ASCII值加上偏移量,并取模256以确保结果在0-255范围内
  109. encryptedAsciiValue = (asciiValue + offset) Mod 256
  110. ' 将加密后的ASCII值转换回字符
  111. encryptedChar = ChrW(encryptedAsciiValue)
  112. ' 将加密后的字符追加到密文字符串中
  113. ciphertext = ciphertext & encryptedChar
  114. Next i
  115. ' 返回加密后的密文
  116. EncryptWithAscii = ciphertext
  117. End Function
  118. Rem 解密函数,功能:将密文按照相同的偏移量解密为明文
  119. Function DecryptWithAscii(ciphertext As String, offset As Integer) As String
  120. Dim plaintext As String ' 初始化用于存储解密后文本的变量
  121. Dim char As String ' 用于临时存储每个字符的变量
  122. Dim asciiValue As Integer ' 用于存储字符的ASCII值的变量
  123. Dim decryptedAsciiValue As Integer ' 用于存储解密后的ASCII值的变量
  124. plaintext = "" ' 初始化明文为空字符串
  125. ' 遍历密文中的每个字符
  126. For i = 1 To Len(ciphertext)
  127. ' 提取密文中的第i个字符
  128. char = mid(ciphertext, i, 1)
  129. ' 获取字符的Unicode(ASCII)值
  130. asciiValue = AscW(char)
  131. ' 将字符的ASCII值减去偏移量,加上256确保结果为正数,然后取模256
  132. decryptedAsciiValue = (asciiValue - offset + 256) Mod 256
  133. ' 将解密后的ASCII值转换回字符
  134. decryptedChar = ChrW(decryptedAsciiValue)
  135. ' 将解密后的字符追加到明文字符串中
  136. plaintext = plaintext & decryptedChar
  137. Next i
  138. ' 返回解密后的明文
  139. DecryptWithAscii = plaintext
  140. End Function
  141. Rem 执行过程,功能:用于展示加密和解密的流程
  142. Sub TestRun_3()
  143. Dim plaintext As String ' 初始化明文变量
  144. Dim offset As Integer ' 初始化偏移量变量
  145. Dim encryptedText As String ' 初始化加密后的文本变量
  146. Dim decryptedText As String ' 初始化解密后的文本变量
  147. plaintext = "Hello,Python!" '设置密文内容
  148. offset = 43 ' 设置偏移量
  149. ' 调用加密函数加密明文
  150. encryptedText = EncryptWithAscii(plaintext, offset)
  151. ' 输出加密后的文本
  152. Debug.Print "加密后的文本: " & encryptedText
  153. ' 调用解密函数解密密文
  154. decryptedText = DecryptWithAscii(encryptedText, offset)
  155. ' 输出解密后的文本
  156. Debug.Print "解密后的文本: " & decryptedText
  157. End Sub
  158. '加密后的文本: s????W{¤????L
  159. '解密后的文本: Hello , Python!

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行对应的Sub程序即可输出结果。 

2、相关文章:

2-1、Python-VBA函数之旅-all()函数 

2-2、Python-VBA函数之旅-any()函数 

2-3、Python-VBA函数之旅-bin()函数 

2-4、Python-VBA函数之旅-bool()函数 

Python算法之旅:Myelsa的Python算法之旅(高铁直达)-CSDN博客

Python函数之旅:Myelsa的Python函数之旅(高铁直达)

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/525394
推荐阅读
相关标签
  

闽ICP备14008679号