- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试生成 .wav 文件,并具有将 10 进制整数转换为十六进制的函数。我需要像字节一样写入这些十六进制数字,而不是简单地将它们编码为字节。我可以使用转义序列进行硬编码,但我需要使用我的函数提供的字符串。
我的临时工作使用了 eval,如下所示。
eval("b'" + endian(bytestring(tohex(16, 32))) + "'")
在不进行评估的情况下完成此任务的更优选方法是什么?
这里有一些代码可以帮助您更好地了解情况。
with open('song.wav', 'wb') as f:
f.write(ChunkID)
f.write(ChunkSize)
f.write(Format)
f.write(Subchunk1ID)
f.write(Subchunk1Size)
f.write(AudioFormat)
f.write(NumChannels)
f.write(SampleRate)
f.write(ByteRate)
f.write(BlockAlign)
f.write(BitsPerSample)
f.write(Subchunk2ID)
f.write(Subchunk2Size)
f.write(Data)
使用硬编码值效果很好。
ChunkID = b'RIFF' #big 1
ChunkSize = b'\x1a\xea\xc4\x00' #little 2
Format = b'WAVE' #big 3
Subchunk1ID = b'fmt ' #big 4
Subchunk1Size = b'\x10\x00\x00\x00' #little 5
AudioFormat = b'\x01\x00' #little 6
NumChannels = b'\x02\x00' #little 7
SampleRate = b'\x22\x56\x00\x00' #little 8
ByteRate = b'\x88\x58\x01\x00' #little 9
BlockAlign = b'\x04\x00' #little 10
BitsPerSample = b'\x10\x00' #little 11
Subchunk2ID = b'data' #big 12
Subchunk2Size = b'\x10\xb1\x02\x00' #little 13
Data = b'' #little 14
我需要更大的灵 active ,并且需要使用函数获得类似的结果。
def tohex(val, nbits):
a = hex((val + (1 << nbits)) % (1 << nbits))
pad = nbits/4 - (len(a) - 2)
for i in range(0, pad):
a = a[:2] + '0' + a[2:]
return a
def bytestring(hexstring):
hexstring = hexstring[2:]
bstring = ''
for i in range(0, len(hexstring)/2):
bstring += '\\x'
bstring += hexstring[2*i: 2*i+2]
return bstring
def endian(bstring):
return '\\'+'\\'.join(reversed(bstring.split('\\'))).rstrip('\\')
这就是我调用函数的方式
sample_rate = 44100
channels = 2
sample_bits = 16
sample_count = 176400
ChunkID = b'RIFF'
Format = b'WAVE'
Subchunk1ID = b'fmt '
Subchunk1Size = eval("b'" + endian(bytestring(tohex(16, 32))) + "'") #n bit samples : tohex(n,m)
AudioFormat = eval("b'" + endian(bytestring(tohex(1, 16))) + "'") #uncompressed when n=1
NumChannels = eval("b'" + endian(bytestring(tohex(channels, 16))) + "'") #n channels
SampleRate = eval("b'" + endian(bytestring(tohex(sample_rate, 32))) + "'")
BitsPerSample = eval("b'" + endian(bytestring(tohex(sample_bits, 16))) + "'")
ByteRate = eval("b'" + endian(bytestring(tohex(sample_rate*channels*sample_bits/8, 32))) + "'")
BlockAlign = eval("b'" + endian(bytestring(tohex(channels*sample_bits/8, 16))) + "'")
Subchunk2ID = b'data'
Subchunk2Size = eval("b'" + endian(bytestring(tohex(sample_count*channels*sample_bits/8, 32))) + "'")
ChunkSize = eval("b'" + endian(bytestring(tohex(36 + sample_count*channels*sample_bits/8, 32))) + "'")
Data = b''
for i in range(0, 176400): #Just test samples
if i % 32 < 16:
Data += b'\x10\xe7\x10\xe7'
else:
Data += b'\xf0\xa8\xf0\xa8'
更新:我添加了一个新函数来处理以前的格式并返回一个可以直接写入文件的表单。我标记的解决方案使用字节,但在 python 2.7 中我必须使用字节数组。
def barray(bstring):
hexmap = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7,'8':8, '9':9, 'a':10, 'b':11, 'c':12, 'd':13, 'e':14, 'f':15}
bstring = bstring.lstrip('\\x')
bstring = bstring.split('\\x')
bstring = map(lambda x: 16*hexmap[x[0]]+hexmap[x[1]], bstring)
return bytearray(bstring)
现在,在我调用函数后,数据已准备好写入文件,而无需使用 eval()。
variable = barray(endian(bytestring(tohex(n, m))))
最佳答案
您尝试过使用字节
吗?
data = '\x00\x20\x10'
newdata = [int(i) for i in data.encode()]
print(newdata)
>>> [0, 32, 16]
print(bytes(newdata))
>>> b'\x00 \x10' # it only looks like the middle value is missing, it isn't
print([i for i in b'\x00 \x10'])
>>> [0, 32, 16] # yep, all still there
在澄清问题后,根据对问题的更好理解进行了编辑。
关于python - 写入转义字节字符的字符串,即 '\x00\x20\...' ,就好像它们是字节一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31819001/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!