将Longs数组写入VBA中的HEX文件的最佳方法是什么?

问题描述 投票:0回答:1

我有一个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
arrays vba file hex write
1个回答
0
投票

数据类型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
© www.soinside.com 2019 - 2024. All rights reserved.