求转一段AS3代码到VB.NET

清晨曦月 元老
博客专家认证
2010-03-14 07:56:56
用ASV6得到的AS3代码:
class ABC {

private var _state:int;
private var _multiper:int;
private var _adder:int;

public function updateState():int{
_adder = 2059198199;
_multiper = 1501;
_state = ((~(_state) + _adder) * _multiper);
_state = (_state ^ (_state >> 16));
return (_state);
}
}


怎么转VB.NET呢?根据我的理解,应该是这样的:

~是参数与&HFFFFFFFF进行XOR运算
^应该是参数先转为UINTEGER然后进行XOR运算
<<和>>位移操作符与VB.NET都一样
但是这样转了以后,在_state = ((~(_state) + _adder) * _multiper);这句就会出问题,因为参数太大了而溢出。难道AS3里面*不是乘法?我只知道还可以代表未知类型相当于VB.NET的OBJ对象,但那个意义不是逻辑运算符不会出现在运算中吧。

求达人指点!!后续还有类似问题,这个帖子先100+11吧,给正确代码的100+,其他视情况得那11了。
...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyuebuyu 2010-03-15
  • 打赏
  • 举报
回复

Function updateState() As Integer
Dim _adder As Integer
Dim _multiper As Integer
Dim _state As Integer
_adder = 2059198199
_multiper = 1501

_state = Not (_state)
_state += _adder
Dim l1 As Long = System.Math.BigMul(_state, _multiper)
Dim l2 As Long = &HFFFFFFFFL
l1 = l1 And l2
l1 = &HFFFFFFFF - l1
l1 = l1 And &HFFFFFFFFL
_state = l1
_state = (_state Xor (_state >> 16))
Return _state
End Function


对应C#得出的过程,可以得到结果_state是&H5A98ED39
xupeihuagudulei 2010-03-15
  • 打赏
  • 举报
回复
帮顶
路过
清晨曦月 元老 2010-03-15
  • 打赏
  • 举报
回复
&H5A98ED39这个结果是正确的,我在FLASH里面测试了一下。。。确实是这个值。结贴吧。。。


xingyuebuyu 2010-03-14
  • 打赏
  • 举报
回复

int _adder = 2059198199;
int _multiper = 1501;

int _state = 0;
_state = (~(_state) + _adder) * (_multiper);
_state = (_state ^ (_state >> 16));


在C#中可以得到_state 的值为0x5a98ed39.

看来在VB.NET中计算中需要进行转换啊
Fibona 2010-03-14
  • 打赏
  • 举报
回复
AS中的精度跟VB.net不一样,把AS3中的int 改成VB.net的long就行了
波导终结者 2010-03-14
  • 打赏
  • 举报
回复
给个_state的值用来测试好吗
清晨曦月 元老 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 alifriend 的回复:]
VB.NET code
Function updateState() As Integer
Dim _adder As Integer
Dim _multiper As Integer
Dim _state As Integer
_state = ((Not (_state) + 1 + _adder) * _mul……
[/Quote]

首先肯定你的回答,应该是很正确了,NOT +1和XOR &HFFFFFFFF确实是一个事,不过我的问题主要是溢出
_adder = 2059198199;
_multiper = 1501;
这个事咋办?是ASV反编译的问题,还是AS3数据类型“灵活”的事?反正他不像VB.NET那么严格。我用FLASH测试了代码,得到的State是&H5A98ED39,么有什么溢出不溢出的。。。。可VB.NET会溢出
ws_hgo 2010-03-14
  • 打赏
  • 举报
回复
友情帮顶...........
波导终结者 2010-03-14
  • 打赏
  • 举报
回复
    Function updateState() As Integer
Dim _adder As Integer
Dim _multiper As Integer
Dim _state As Integer
_state = ((Not (_state) + 1 + _adder) * _multiper)
_state = (_state Xor (_state >> 16))
Return _state

End Function

原来的代码没看到_state哪有传值,视具体情况修改吧

16,556

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧