bgolab Posted November 15, 2007 Share Posted November 15, 2007 Hi All, I have a code fragment in C and I want to convert it to AutoIt: table is unsigned char ================ unsigned int x, y, z; y = key; x=0 for (i = 0; i<3; i++) { x = (x & 0xffffff00) | table; y ^= x; y += x; x <<= 8; y ^= x; x <<= 8; y -= x; x <<= 8; y ^= x; z = y & 0x1f; y = (y << z) | (y >> (32 - z)); } return y; It works fine in C but there is a problem in AutoIt. During bit operation (i.e. BitXOR which represents ^) some variables like y (declared in C as unsigned) are treated as signed in AutoIt. How to fix it in AutoIt? Bogdan Link to comment Share on other sites More sharing options...
PsaltyDS Posted November 15, 2007 Share Posted November 15, 2007 Hi All, I have a code fragment in C and I want to convert it to AutoIt: It works fine in C but there is a problem in AutoIt. During bit operation (i.e. BitXOR which represents ^) some variables like y (declared in C as unsigned) are treated as signed in AutoIt. How to fix it in AutoIt? Bogdan You didn't show your AutoIt code, so there's no telling what you did wrong. BitXOR works fine: $y = 0x0FF $x = 0xFFFFFF00 $z = BitXOR($x, $y) $sAns = "0x" & Hex($z, 8) MsgBox(64, "Answer", $sAns) Can you post some AuotIt code that gives an unexpected answer? Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
bgolab Posted November 16, 2007 Author Share Posted November 16, 2007 You didn't show your AutoIt code, so there's no telling what you did wrong. BitXOR works fine: $y = 0x0FF $x = 0xFFFFFF00 $z = BitXOR($x, $y) $sAns = "0x" & Hex($z, 8) MsgBox(64, "Answer", $sAns) Can you post some AuotIt code that gives an unexpected answer? The code in AutoIT $y=$key $x=0 For $i=0 To 2 Step 1 $xx=BitAND($x,0xffffff00) $x=BitOR($xx, Asc($znak[$i])) $y=BitXOR($y, $x) $y=$y+$x $x=BitShift($x,-8) $y=BitXOR($y, $x) $x=BitShift($x,-8) $y=$y-$x $x=BitShift($x,-8) $y=BitXOR($y, $x) $z=BitAND($y,0x1F) $y1=BitShift($y,-$z) $y2=BitShift($y,32-$z) $y=BitOR($y1, $y2) Next Return $y Link to comment Share on other sites More sharing options...
SkinnyWhiteGuy Posted November 16, 2007 Share Posted November 16, 2007 I've had the same problem before, answer for me was right before returning, convert your number $y to hex using the builtin Hex() function, then use the following function to convert that into an unsigned number: Func Hex2Dec($hex) Local $dec = 0, $i For $i = 0 To StringLen($hex) - 1 $dec += Dec(StringMid($hex, StringLen($hex)-$i,1)) * (16 ^ $i) Next Return $dec EndFunc Link to comment Share on other sites More sharing options...
PsaltyDS Posted November 16, 2007 Share Posted November 16, 2007 (edited) I've had the same problem before, answer for me was right before returning, convert your number $y to hex using the builtin Hex() function, then use the following function to convert that into an unsigned number: Hmm... Is this what you expected from that? $x = 0xFFFFFF00 ConsoleWrite("Debug: $x = " & $x & @LF) ; = -256 $y = Hex2Dec($x) ConsoleWrite("Debug: $y = " & $y & @LF) ; = 598 Func Hex2Dec($hex) Local $dec = 0, $i For $i = 0 To StringLen($hex) - 1 $dec += Dec(StringMid($hex, StringLen($hex)-$i,1)) * (16 ^ $i) Next Return $dec EndFunc Edit: Oops, I see it now. Have to pass string representation by changing the first line to: $x = Hex(0xFFFFFF00, 8) Then I get $x = $x = FFFFFF00; $y = 4294967040. Edited November 16, 2007 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
bgolab Posted November 16, 2007 Author Share Posted November 16, 2007 Hmm... Is this what you expected from that? $x = 0xFFFFFF00 ConsoleWrite("Debug: $x = " & $x & @LF) ; = -256 $y = Hex2Dec($x) ConsoleWrite("Debug: $y = " & $y & @LF) ; = 598 Func Hex2Dec($hex) Local $dec = 0, $i For $i = 0 To StringLen($hex) - 1 $dec += Dec(StringMid($hex, StringLen($hex)-$i,1)) * (16 ^ $i) Next Return $dec EndFunc Edit: Oops, I see it now. Have to pass string representation by changing the first line to: $x = Hex(0xFFFFFF00, 8) Then I get $x = $x = FFFFFF00; $y = 4294967040. --- I'll try it. I suspect a problem with "y -= x;" because signed operation /AutoIt/ involves a correction (probably nased on CPU's "overflow" bit). Maybe it is a good idea to simulate CPU operation using Autoit in this case. I mean generic summer and substractor:) Just joking... Anyway, unsigned variables seem to useful even in AutoIt... Bogdan Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now