0

我有一个 Longs 数组(在 10k 或可能 100k 长的范围内),我必须将它们作为 8 位 little-endians 放入 HEX 文件 (.wav) 中。做这个的最好方式是什么?

我使用了一个简单的 PUT,但它并没有按计划进行。我尝试了一些应该产生的测试值

德 A8 CC 16 00 00 1E 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
4

1 回答 1

0

Long 数据类型的存储大小为 4 个字节。因此,由于您已将数组声明为 Long,因此数组中的每个值都将作为 4 个字节存储在文件中。

因此,例如,如您所知,-22,306 转换为十六进制的 A8 DE。但是,由于该值将存储为 4 个字节,因此存储在文件中的实际值将是 FF FF A8 DE,或小端格式的 DE A8 FF FF。

现在,如果值的范围将在 -32,768 和 32,767 之间(含),您可以将数组声明为 Integer。这意味着每个值将作为 2 个字节存储在文件中。所以 -22,306 将被存储为 DE A8。

顺便说一句,您可以避免使用 FileSystemObject 对象来将现有文件截断为 0 字节。相反,您可以使用 Kill 方法在文件已存在时将其删除,因为二进制模式下的 Open 语句将在文件不存在时创建它。

因此,您的宏可以重写如下......

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
于 2020-06-08T21:16:56.000 回答