十六進制轉字符串

遇見的問題及解決方法:

關於Oracle數據庫 blob字段內容導出問題,大家肯定都百度了不少知識,而這一次,我碰到了個新問題,別人給了我一些blob導出的十六進制數據,讓我幫忙轉化成文本,經過不懈的百度,還是解決了這個問題,特此記錄一下,大家有好的辦法也可以評論,互相學習。

給大家看下數據哦
在這裏插入圖片描述
在這裏插入圖片描述
密密麻麻的恐怖如斯,然後放上我的代碼:

在這裏插入圖片描述

說下思路:
利用xlrd 去訪問excel,首先是打開文件 獨取對應的表。我們所需要的數據在第三列,起始位置有效位置是第二行

list = table.col(colx=2 , start_rowx=1 , end_rowx=None)

拿到數據以後我們打印一下會發現,有開頭是Number的 有的是text,這裏我們只需要text的

str(li).startswith('text')

拿到真正需要處理的數據後,就要開始搞事情了,不過有個條件,我們來看下:

def unhexlify(hexstr): # known case of binascii.unhexlify
    """
    Binary data of hexadecimal representation.
    
    hexstr must contain an even number of hex digits (upper or lower case).
    """
    return b""

這裏我們看見人家定義的方法,聲明需要偶數的十六進制數字,我們得需要進行一點處理,將“0x”去掉。然後保證數值是偶數個,然後進行方法調用。

hex = str(li)[8:-1]
if(len(hex)%2 != 0):
            hex = hex[0:-1]

        txt = binascii.unhexlify(hex)

得到了想要的結果,就只需要進行指定格式保存了,給大家看下效果

在這裏插入圖片描述
在這裏插入圖片描述

下面貼出完整代碼供大家參考:

import binascii
import xlrd
data = xlrd.open_workbook('病歷.xlsx')
table = data.sheets()[0]  #通過索引順序獲取表

list = table.col(colx=2 , start_rowx=1 , end_rowx=None)

#print(len(list))
di = 0

for li in list:
    #print(str(li))
    if(str(li).startswith('text')):

        hex = str(li)[8:-1]

        print(len(hex))   #打印長度
        print(hex) #打印數據

        if(len(hex)%2 != 0):
            hex = hex[0:-1]

        txt = binascii.unhexlify(hex)
        print(txt)

        with open('內容//'+ str(di) +'.xml' , 'wb')as f:
            f.write(txt)
        di = di+1
print("done")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章