Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
CRC32 returns negative on big files
Message
From
01/08/2011 04:15:42
 
 
General information
Forum:
ASP.NET
Category:
Coding, syntax and commands
Environment versions
Environment:
VB 9.0
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Application:
Web
Miscellaneous
Thread ID:
01519635
Message ID:
01519784
Views:
15
>>>>>>>>>>>>(1) The short way is to cast the return result to UInteger, and change the return type of GetCrc32() to UInteger
>>>>>>>>>>>
>>>>>>>>>>>IIRC you can't do that cast in VB (although you can in C# using 'unchecked')
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>Viv,
>>>>>>>>>>
>>>>>>>>>>I don't know, but I'd be very surprised if it weren't possible
>>>>>>>>>
>>>>>>>>>Just tried this which won't compile:
Dim test As UInteger = DirectCast(Int32.MaxValue, UInteger)
>>>>>>>>>If it was a valid cast what resulting UInteger would you expect from a negative value signed int ?
>>>>>>>>>In C#:
unchecked { UInt32 test = ((UInt32)Int32.MinValue); }
>yields 2147483648....
>>>>>>>>
>>>>>>>>
>>>>>>>>Firstly, I'm surprised that it yields an even number
>>>>>>>>
>>>>>>>>Secondly, if that's the case, I guess you'll need t check whether is was negative, and if so, set the left most bit after the 'cast'
>>>>>>>
>>>>>>>But if the signed int is negative then there is no accurate equivalent for an unsigned int ?
>>>>>>>I'm assuming the C# cast simple treats the 32 bits as being an unsigned value ?
>>>>>>>FWIW:
unchecked { Int32 test = ((Int32)UInt32.MaxValue);
>gives -1
>>>>>>
>>>>>>
>>>>>>Yes, of course, all bits set is signed -1 and unsigned the max value
>>>>>>
>>>>>>When the leftmost bit is set in a signed int type, then it is considered as negative
>>>>>>
>>>>>>>But if the signed int is negative then there is no accurate equivalent for an unsigned int ?
>>>>>>
>>>>>>Viv, this isn't about maths. The crc32 is just a structure that is 32 bits wide
>>>>>
>>>>>That's why I said : "I'm assuming the C# cast simple treats the 32 bits as being an unsigned value"
>>>>>
>>>>>>If you think about it as a signed 32 bit structure and the leftmost bit is set then the number is negative
>>>>>>
>>>>>>If you look at it as an unsigned 32 bit structure, the same pattern is a number >= 0
>>>>>
>>>>>I understand that - my point was that, in normal application usage, converting a negative signed int to an unsigned int would not make sense.
>>>>
>>>>
>>>>Well, if the cast does not work, I think I have figured out how to - pardon the syntax - and untested
>>>>
>>>>If the number is not negative, I see no problem in converting
>>>
>>>What if the unsigned positive value > Int32.MaxValue() ?
>>>
>>
>>Not possible - it is a 32 bit wide structure that is interpreted as a signed 32 bit integer
>
>You mean it's not possible for unsigned positives to be larger than an Int32 ? But
>Int32.MaxValue = 2147483647
>UInt32.MavValue = 4294967295


I gave a wrong answer


All the manipulation (and, xor, shift) is done on a 32 bit structure. So you only have 32 bits

In the signed world, the leftmost bit is the sign bit which leaves 31 bits for the 'number'
In the unsigned world, there is no sign bit, it's >= 0 , which leaves 32 bits for the number


So whatever manipulation you do, the data stays in 32 bits

In the end, you 'express' what is in the data. You speak signed language or unsigned language, but the internal representation is the same
Gregory
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform