我有一个Longs数组(长度在10k或100k之内),我必须将它们作为8位的Little-endian放入HEX文件(.wav)中。做这个的最好方式是什么?
我使用了一个简单的PUT,但是没有按计划进行。我尝试了一些应该产生的测试值
DE A8CC 1600 001E 5B
我得到了
DE A8 FF FF CC 16 00 00 00 00 00 00 1E 5B 00 00
我使用的代码如下。您有什么想法吗?如何解决?在我尝试的每个值中,记录之间总会有一个额外的00 00或FF FF。
Sub Gera_sinal()
Dim sinal() As Long
ReDim sinal(3)
'Test values
sinal(0) = -22306
sinal(1) = 5836
sinal(2) = 0
sinal(3) = 23326
'Creates a file and puts the values in it
Dim n_arq As Integer
Dim path As String
path = "C:\Users\DELL\Desktop\App\WAVs\Sinal_VBA.wav"
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(path, True)
a.Close
n_arq = FreeFile
Open path For Binary As n_arq
Put n_arq, , sinal
Close n_arq
End sub
数据类型Long的存储大小为4个字节。因此,由于您已将数组声明为Long,因此数组中的每个值将以4个字节的形式存储在文件中。
因此,例如,您知道,-22,306转换为十六进制的A8 DE。但是,由于该值将被存储为4个字节,因此文件中存储的实际值将为FF FF A8 DE或little-endian中的DE A8 FF FF。
现在,如果值的范围在-32,768到32,767(包括)之间,则可以将数组声明为Integer,这样每个值将以2个字节存储在文件中。因此-22,306将存储为DE A8。
顺便说一句,您可以使用Kill方法,而不是使用FileSystemObject对象将现有文件截断为0个字节。
因此,您的宏可以如下重写...
Sub Gera_sinal()
Dim sinal() As Integer
ReDim sinal(3)
'Test values
sinal(0) = -22306
sinal(1) = 5836
sinal(2) = 0
sinal(3) = 23326
'Creates a file and puts the values in it
Dim n_arq As Integer
Dim path As String
path = "C:\Users\DELL\Desktop\App\WAVs\Sinal_VBA.wav"
'delete file, if it already exists
On Error Resume Next
Kill path
On Error GoTo 0
n_arq = FreeFile
Open path For Binary Access Write As n_arq
Put n_arq, , sinal
Close n_arq
End Sub