使用python进行数据编解码
Data encoding and decoding using python
这与其说是一个编程问题,不如说是一个了解什么是什么的问题?我不是CS专业的,我正在尝试了解这3种格式之间的基本区别:
1) EBCDIC 2) 无符号二进制数 3) 二进制编码的十进制数
如果这不是一个真正的问题,我很抱歉,但是 google 在向我解释这个问题时不是很有用
假设我有一串数字,例如“12890”。他们在
中的代表是什么
EBCDIC、无符号二进制数和BCD格式?
是否有 python 2.6 库可用于将任何数字字符串简单地转换为这两种格式中的任何一种?
比如string转ebcdic,我在做
def encodeEbcdic(text):
return text.decode('latin1').encode('cp037')
print encodeEbcdic('AGNS')
但是,我明白了┴╟╒Γ
EBCDIC 是 IBM 字符编码。它用于编码文本。当然,数字可以出现在文本中,如“1600 Pennsylvania Avenue”,因此也有数字代码。要将 1600 转换为 EBCDIC,您需要找到一个 EBCDIC table。然后您查找 1 的代码、6 的代码和 0 的代码(两次。)根据 http://www.astrodigital.org/digital/ebcdic.html 处的 table
0 到 9 的 EBCIDIC 代码分别是 F0 到 F9。这看起来很眼熟,但我不能说我真的记得。
无符号二进制数就是这样。这是以二为底写的数字。 (见下文。)
二进制编码的十进制 (BCD) 是一种旧格式,用于在数字计算机上存储数字的十进制表示形式。每个十进制数字都由其等效的二进制表示。我们以64为例。由于 64 只是 2 的 6 次方,因此在二进制中它表示为 1 后跟 6 个 0:1000000。在二进制编码的十进制中,我们将 6 写入二进制 - 0110,将 4 写入二进制 - 0100,以便BCD 表示是 01100100。每个数字需要四位,因为最大的十进制数字 9 计算结果为 1001。BCD 在 COBOL 中被广泛使用。如果这几天在其他地方使用它,我不熟悉该应用程序。
编辑:我应该解释一下 EBCDIC 中的 F0、F1 等是十六进制代码,所以 F 是 1111,数字与 BCD 中的数字相同。因此,数字的 EBCDIC 结果与 BCD 相同,但在每个数字前多了一个 1111。
saulspatz,感谢您的解释。我能够找出将任何数字字符串转换为不同编码所需的必要方法。我必须参考 Effective Python 第 1 章第 3 项:了解 bytes、str 和 unicode 之间的差异
从那时起,我阅读了更多有关数据类型等的内容。
无论如何,回答我的问题:
1) 字符串到 EBCDIC:
def encode_ebcdic(text):
return text.decode('latin1').encode('cp037')
这里的编码是美国的cp037。您可以将 cp500 用于国际。这是它们的列表:
https://en.wikipedia.org/wiki/List_of_EBCDIC_code_pages_with_Latin-1_character_set
2) 十六进制字符串转无符号二进制数:
def str_to_binary(text):
return int(str, 16)
这很基础,只需将十六进制字符串转换为数字即可。
3)十六进制字符串转二进制编码十进制:
def str_to_bcd(text):
return bytes(str).decode('hex')
是的,您需要将其转换为字节数组,以便进行 BCD 转换。请阅读 saulspatz 回答什么是 BCD 编码。
这与其说是一个编程问题,不如说是一个了解什么是什么的问题?我不是CS专业的,我正在尝试了解这3种格式之间的基本区别:
1) EBCDIC 2) 无符号二进制数 3) 二进制编码的十进制数
如果这不是一个真正的问题,我很抱歉,但是 google 在向我解释这个问题时不是很有用
假设我有一串数字,例如“12890”。他们在
中的代表是什么EBCDIC、无符号二进制数和BCD格式?
是否有 python 2.6 库可用于将任何数字字符串简单地转换为这两种格式中的任何一种?
比如string转ebcdic,我在做
def encodeEbcdic(text):
return text.decode('latin1').encode('cp037')
print encodeEbcdic('AGNS')
但是,我明白了┴╟╒Γ
EBCDIC 是 IBM 字符编码。它用于编码文本。当然,数字可以出现在文本中,如“1600 Pennsylvania Avenue”,因此也有数字代码。要将 1600 转换为 EBCDIC,您需要找到一个 EBCDIC table。然后您查找 1 的代码、6 的代码和 0 的代码(两次。)根据 http://www.astrodigital.org/digital/ebcdic.html 处的 table 0 到 9 的 EBCIDIC 代码分别是 F0 到 F9。这看起来很眼熟,但我不能说我真的记得。
无符号二进制数就是这样。这是以二为底写的数字。 (见下文。)
二进制编码的十进制 (BCD) 是一种旧格式,用于在数字计算机上存储数字的十进制表示形式。每个十进制数字都由其等效的二进制表示。我们以64为例。由于 64 只是 2 的 6 次方,因此在二进制中它表示为 1 后跟 6 个 0:1000000。在二进制编码的十进制中,我们将 6 写入二进制 - 0110,将 4 写入二进制 - 0100,以便BCD 表示是 01100100。每个数字需要四位,因为最大的十进制数字 9 计算结果为 1001。BCD 在 COBOL 中被广泛使用。如果这几天在其他地方使用它,我不熟悉该应用程序。
编辑:我应该解释一下 EBCDIC 中的 F0、F1 等是十六进制代码,所以 F 是 1111,数字与 BCD 中的数字相同。因此,数字的 EBCDIC 结果与 BCD 相同,但在每个数字前多了一个 1111。
saulspatz,感谢您的解释。我能够找出将任何数字字符串转换为不同编码所需的必要方法。我必须参考 Effective Python 第 1 章第 3 项:了解 bytes、str 和 unicode 之间的差异
从那时起,我阅读了更多有关数据类型等的内容。
无论如何,回答我的问题:
1) 字符串到 EBCDIC:
def encode_ebcdic(text):
return text.decode('latin1').encode('cp037')
这里的编码是美国的cp037。您可以将 cp500 用于国际。这是它们的列表: https://en.wikipedia.org/wiki/List_of_EBCDIC_code_pages_with_Latin-1_character_set
2) 十六进制字符串转无符号二进制数:
def str_to_binary(text):
return int(str, 16)
这很基础,只需将十六进制字符串转换为数字即可。
3)十六进制字符串转二进制编码十进制:
def str_to_bcd(text):
return bytes(str).decode('hex')
是的,您需要将其转换为字节数组,以便进行 BCD 转换。请阅读 saulspatz 回答什么是 BCD 编码。