[英]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.pack
在struct.pack
(和C語言)為您執行的操作,因此最好不要重新發明輪子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.