Есть ли способ, чтобы я мог генерировать случайные числа от 0 до & HFFFFFFFF в Visual Basic 6.0?Случайные числа от 0 до & HFFFFFFFF
Я использую следующую функцию
Function RandomNumberLong(Lowerbound As Long, Upperbound As Long) As Long
RandomNumberLong = Clng((Upperbound - Lowerbound + 1) * Rnd + Lowerbound)
End Function
Если я использую
x = RandomNumberLong(0,&HFFFFFFFF)
Он всегда возвращает 0
Проблема здесь является максимальное значение долго можно держать в 7fffffff или 2147483647 в десятичной форме Итак, как я должен это исправить? Даже если я использую один тип данных, он всегда возвращает отрицательный номер без неподписанных чисел.
В соответствии с MSDN Long типа
Long (длинное целое) переменные хранятся в виде подписанного 32-бит (4 байта) чисел в диапазоне от стоимости -2147483648 до 2147483647. Характер символа типа для Long - амперсанд (&).
Но значение FFFFFFFF равно -1 или 4294967294, который переполняется.
Я думаю, что я смущен этим.
Отредактировано:
Поскольку это кажется немного сложным, я закодированы небольшой код Shell использовать команду RDTSC вместо того, чтобы генерировать случайные длинный номер, в том числе опалены и без знака.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Option Explicit
Private Sub Form_Load()
Dim x(1 To 10) As Byte, VAL As Long
CopyMemory x(1), &H60, 1 'PUSHAD
CopyMemory x(2), &H310F, 2 'RDTSC EAX holds a random value
CopyMemory x(4), &HA3, 1 'MOV EAX
CopyMemory x(5), VarPtr(VAL), 4 'Pointer of variable // MOV DWORD [VAL],EAX
CopyMemory x(9), &H61, 1 'POPAD
CopyMemory x(10), &HC3, 1 'RET
CallWindowProc VarPtr(x(1)), 0, 0, 0, 0 'Call the shellcode
MsgBox VAL
End Sub
Просто используйте правильный PRNG и прочитайте 4 байта. – CodesInChaos
Обратите внимание, что этот метод вызова машинного кода ** небезопасен **! Он не работает в современных системах Windows с [защитой выполнения данных] (http://en.wikipedia.org/wiki/Data_Execution_Prevention), что делает его хрупким или внезапным сбоем в современных системах.Вы * должны * заранее отмечать такую память, как исполняемую, с помощью функции WinAPI VirtualProtect. [Вот пример кода] (http://www.activevb.de/tipps/vb6tipps/tipp0715.html) - хотя и с немецкими комментариями. –
Да, почти забыл об этом, спасибо за голову. –