2015-02-23 69 views
0

給定一個字節對象和一個索引,我想從索引和下一個空值(\ x00)之間的字節中讀取一個字符串。例如:從字節中獲取一個字符串直到空

bstr=b'abc\x00defg' 
addr_to_str(bstr,0) # 'abc' 
addr_to_str(bstr,1) # 'bc' 
addr_to_str(bstr,4) # 'defg' 

我可以做到以下幾點:

def addr_to_str(bstr,i): 
    return bstr[i:].split(b'\x00')[0].decode('utf-8') 

由於bytes對象是非常大的,我想的addr_to_str一個有效的版本。我是Python新手,不知道解釋器如何處理split()調用,我只想訪問第一個拆分結果。或者需要.decode()

問題:有沒有更好的和pythonic的方式來做addr_to_str()

+1

['bytes.split()'](https://docs.python.org/3/library/stdtypes.html?highlight=split#bytes.split)有一個可選的'maxsplit'參數...或者你可以使用['bytes.partition()'](https://docs.python.org/3/library/stdtypes.html?highlight=partition#bytes.partition),它只做一個。 – martineau 2015-02-23 21:18:06

回答

1

如何(在Python 2):

def addr_to_str(s, pos): 
    end = s.find('\0', pos + 1) 
    if end != -1: 
     return s[pos:end] 
    else: 
     return s[pos:] 

此掃描一次尋找一個空字符串,然後創建一個切片。

+0

's'是一個字節而不是字符串。它抱怨s.find('\ 0',)。該函數應該佔用一個字節並返回一個字符串。 – 2015-02-23 21:22:36

+0

適用於Python 2.7。如果您使用的是Python 3,則可能需要指定它。 – NPE 2015-02-23 21:29:01

+0

因此,在Python 3中,似乎需要顯式調用.decode()。 – 2015-02-23 21:30:59

相關問題