簡體   English   中英

Python和整數表示法(前導零問題)

[英]Python and integer representation (leading zeros issue)

這類似於在編程堆棧交換上提出的問題: https : //softwareengineering.stackexchange.com/questions/158247/binary-representation-in-python-and-keeping-leading-zeros

本質上,我用十六進制跟蹤一些數字:

SOME_NUMBERS = (0xAABBCCDDEEFF, 0xAA55AA55AA55, 0xBEEF0000BEEF)

但是,Python試圖超越我,過度思考,因此,當我將值寫入文件時,我會在十六進制編輯器中得到它:

00 00 00 00 00 00 00 00 00 00 AA BB CC DD EE FF

在我看來,Python會將我的48位數字存儲並寫入為64位或128位數字。 如何防止前導零寫入文件? 相比之下,當使用numpy.random.bytes(6) ,Python會將值寫入文件而沒有前導零,因此我認為它應該能夠執行此操作。 思考?

關鍵是如何打包數字。 您可以寫單個字節-數字格式為6個字節是很不常見的。 我發現以下適用於其中一個值:

import struct

outfile = 'output.dat'
fh = open(outfile, "wb")

var = struct.pack('6B', 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF)

fh.write(var)
fh.close()

如果使用其他類型,例如short,int或long(或其組合),則可能會遇到字節序問題。

如果要將48位二進制值寫入文件,則必須自己寫入6個字節。 沒有該長度的本機數字格式。 使用struct模塊將值轉換為字節:

packed = struct.pack('>q', value) # 64 bits (8 bytes)
f.write(packed[-6:])

要解決我的問題,我必須做兩件事:

1)切換至Python 3 2)使用int.to_bytes()

f = open(fileName, 'wb')
for d in dataBuffer:
    if type(d) == int:
         f.write(d.to_bytes(6, byteorder='big'))
    else:
         f.write(d)
    f.close()

我無法使用struct.pack()或numpy.savetext(),因為我需要處理2,000個文件的10,000個隨機值。 這似乎比較容易,但是我還必須使我的代碼能夠與Python 3一起使用。我了解到Python在試圖變得聰明並為用戶做事的同時,最終使事情變得一團糟並增加了挫敗感。

您可以使用np.savetxt保存為文本:

import numpy as np
sn = np.array([0xAABBCCDDEEFF, 0xAA55AA55AA55, 0xBEEF0000BEEF])
np.savetxt('testfile',sn,'0x%X')

要么

np.savetxt('testfile',sn,'%X') # without the '0x'

如果您不想使用struct.pack ,可以通過屏蔽源整數的連續字節並使用chr將它們轉換為字節字符串來將字節分別寫入文件:

for shift in range(40, -1, -8):
    f.write(chr((d >> shift) & 0xff))

但這基本上是struct.packstruct.pack (和C語言)為您執行的操作,因此最好不要重新發明輪子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM