gpt4 book ai didi

vb6 - 在 VB6 中将 Double 拆分为 Long loword 和 Long hiword

转载 作者:行者123 更新时间:2023-12-04 22:39:19 25 4
gpt4 key购买 nike

我需要使用 kernel32 的 SetFilePointer 函数来读取磁盘的一个扇区,该扇区的地址包含在一个 double 中以解决大小问题。
我知道 ReadFile 函数接受 loword as long 和 hiword 作为 long 参数,但我无法将我的双地址拆分为两个字。

我尝试了几种使用 Mod 和 Fix 的方法,但最后我只有溢出错误。

LoWord = CLng(dNum Mod CDbl(4294967295)) 'Dont care the number I use, I always get overflow error

或者
LoWord = CLng(FMod(dNum, 4294967295#))
HiWord = CLng(dNum - (FMod(dNum, 4294967295#))) 'tryed different number to see the behaviour, don't care

在哪里
Public Function FMod(a As Double, b As Double) As Double
FMod = a - Fix(a / b) * b

'http://en.wikipedia.org/wiki/Machine_epsilon
'Unfortunately, this function can only be accurate when `a / b` is outside [-2.22E-16,+2.22E-16]
'Without this correction, FMod(.66, .06) = 5.55111512312578E-17 when it should be 0
If FMod >= -2 ^ -52 And FMod <= 2 ^ -52 Then '+/- 2.22E-16
FMod = 0
End If
End Function

我尝试将 double 转换为 byteArray 或十六进制字符串以尝试“手动”字节移位,但没有成功。

我已经看到 Convert Double into 8-bytes array ,但未经修改的样本总是将 dNum=1 转换为 [0, 0, 0, 0, 0, 0, 240, 63] 作为结果,这似乎不是正确的。

您是否有一些技巧或其他方法可以从 VB6 中的磁盘读取具有大地址的扇区?

感谢大家阅读我的问题。

为了更好地说明我在做什么:
我知道也许 vb6 不是最好的选择,但现在我已经开始了......
我从十六进制格式(作为字符串)的 INI 文件(可变)中读取了一个扇区号,我将其转换为 Long(但它应该以 double 形式携带,还是什么?),考虑到每个扇区 512 个字节。
我必须从磁盘读取的字节数,从那个扇区开始,是一个常数。

当我使用该功能时
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)

我必须指定字节数,然后我必须乘以 512。这导致我试图绕过溢出。

我也试过这个方法:
Private Type TKK_Dbl
Value As Double
End Type

Private Type Dbl2Long
LowVal As Long
HighVal As Long
End Type

Private D As TKK_Dbl
Private L As Dbl2Long

在功能上...
D.Value = CDbl(iStartSec) * CDbl(BytesPerSector)
LSet L = D
Call SetFilePointer(hDevice, L.LowVal, L.HighVal, FILE_BEGIN)

但它对我不起作用。

最佳答案

根据你的编辑,我做了一些谷歌搜索,看看是否有一个 Win API 来做左移,因为乘以 512 只是按位左移 9。

我遇到了 RtlLargeIntegerShiftLeft 可以做到这一点(在这里找到 https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/rtlenlargedintegermultiply)。

接下来,为了节省您一些时间,我找到了使用它的声明的 VB6 示例(此处: http://www.xbeat.net/vbspeed/c_ShiftLeft.htm )

Private Type LARGEINT
Long1 As Long
Long2 As Long
End Type

Private Declare Function RLIShiftLeft Lib "ntdll" Alias "RtlLargeIntegerShiftLeft" _
(ByVal Val1 As Long, ByVal Val2 As Long, ByVal ShiftCount As Long) As LARGEINT

祝你好运!

关于vb6 - 在 VB6 中将 Double 拆分为 Long loword 和 Long hiword,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58154714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com