2

所以我正在为一个 VB6 项目创建一个 Activation 类,但我遇到了一个大脑放屁。我已经设计了如何通过以下方式为这个特定产品生成序列号。

XXXX-XXXX-XXXX-XXXX

如果我知道匹配的文档使我能够理解具有该组数字的代码,则每组数字都将代表我可以读取的数据。因此,例如,第一组可能代表产品出售给客户的月份。但是我不能让一月份的所有序列号都以相同的四位数字开头,因此需要进行一些内部数学运算来计算这个值。我登陆的是这样的:

ABCD = 序列号第一组数字 (A + B) - (C + D) = #

现在 # 将与一个十六进制值表相关,然后表示产品销售的月份。就像是...

1 - 一月

2 - 二月

3 - 三月

……

B - 十一月

C - 十二月

我的问题在这里 - 如果我知道我需要总数等于 B(11) 那么我如何准确地向后编码以生成 (A + B) - (C + D) = B(11)?这是一个非常简单的方程式,我知道——但我刚刚遇到了一些事情,似乎无法朝着正确的方向开始。我不是要求完整的代码工作,而只是推动。如果您有完整的解决方案并想分享,我总是愿意学习更多。

我正在使用 VB6 进行编码,但 VB.NET、C#、C++ 解决方案也可以工作,因为我可以相对轻松地将它们移植过来。非常感谢社区的帮助!

4

3 回答 3

2

没有单一的解决方案(你有一个包含四个变量的方程)。你必须选择一些随机数。这是一个有效的方法(在 Python 中,但你明白了):

from random import randint

X = 11 # the one you're looking for

A_plus_B = randint(X, 30)
A = randint(max(A_plus_B - 15, 0), min(A_plus_B, 15))
B = A_plus_B - A

C_plus_D = A_plus_B - X
C = randint(max(C_plus_D - 15, 0), min(C_plus_D, 15))
D = C_plus_D - C

我假设您允许使用十六进制数字;如果您只想要 0 到 9,请将 15 替换为 9 并将 30 替换为 18。

于 2009-12-22T17:40:42.293 回答
0

这可能看起来有点骇人听闻,并且可能无法将您带到您想去的地方。但是,它应该为您的键字符串产生更广泛的值:

Option Explicit

Private Function MonthString(ByVal MonthNum As Integer) As String
    'MonthNum: January=1, ... December=12.  Altered to base 0
    'value for use internally.
    Dim lngdigits As Long

    MonthNum = MonthNum - 1
    lngdigits = (Rnd() * &H10000) - MonthNum
    MonthString = Right$("000" & Hex$(lngdigits + (MonthNum - lngdigits Mod 12)), 4)
End Function

Private Function MonthRecov(ByVal MonthString As String) As Integer
    'Value returned is base 1, i.e. 1=January.
    MonthRecov = CInt(CLng("&H" & MonthString) Mod 12) + 1
End Function

Private Sub Form_Load()
    Dim intMonth As Integer
    Dim strMonth As String
    Dim intMonthRecov As Integer
    Dim J As Integer

    Randomize
    For intMonth = 1 To 12
        For J = 1 To 2
            strMonth = MonthString(intMonth)
            intMonthRecov = MonthRecov(strMonth)
            Debug.Print intMonth, strMonth, intMonthRecov, Hex$(intMonthRecov)
        Next
    Next
End Sub
于 2009-12-22T18:44:13.460 回答
0

好的 - 笔和纸始终是解决方案......所以这里......

试图找出 (A + B) - (C + D) 的值应该等于某个称为 X 的数字。首先,我知道我想要 HEX 值,以便将我限制为 0-F 或 0-15。从那里我需要一个更好的起点,所以我将生成一个随机数,它代表 (A + B) 的总和,我们称之为 Y,但不能低于 X 值。然后从该数字中减去 Y 值X 来确定将表示 (C + D) 的值,我们将其称为 Z。使用类似的逻辑将 Y 和 Z 分解为两个数字,每个数字可以表示 (A + B) = Y 和 (C + D ) = Z。在这一切都说完之后,我应该有一个很好的随机化创建 4 个数字,当插入我的方程时将返回一个合适的结果。

只是不得不通过大脑放屁。

于 2009-12-22T17:42:40.710 回答