RadicalSoftwareSolutions
asked on
How to interpret DWORD in vb.net
Hi
I have spent hours reading up on this subject and it's done my head in - please help
I am accessing data from a remote sensor via TCP socket - it's all working fine until I get to intertpret the data.
The incoming data is defined by the manufacturer as
typedef struct
{
WORD SyncHeader;
WORD SyncID;
DWORD UnitID;
} SyncStruct;
SyncHeader is always 0xCAC8
SyncID is a message sequence number
UnitID is the device identification number
How do I access the data via VB.NET? Specifically I want the UnitID as an integer
Many thanks for your help
I have spent hours reading up on this subject and it's done my head in - please help
I am accessing data from a remote sensor via TCP socket - it's all working fine until I get to intertpret the data.
The incoming data is defined by the manufacturer as
typedef struct
{
WORD SyncHeader;
WORD SyncID;
DWORD UnitID;
} SyncStruct;
SyncHeader is always 0xCAC8
SyncID is a message sequence number
UnitID is the device identification number
How do I access the data via VB.NET? Specifically I want the UnitID as an integer
Many thanks for your help
If I am not mistaken the DWORD is an unsigned Integer anyway, so UInt32 as datatype.
In other words, will something like this work out for you.
Dim unitID AS UInt32 = SyncStruct.UnitID
You will have to adjust for how the SyncStruct actually shows up in your code. You indicated you are receiving data fine, just need to interpret so would be dependent on how the data is coming across to you if that makes sense.
Dim unitID AS UInt32 = SyncStruct.UnitID
You will have to adjust for how the SyncStruct actually shows up in your code. You indicated you are receiving data fine, just need to interpret so would be dependent on how the data is coming across to you if that makes sense.
ASKER
Thanks for reply
I can't use the struct as it is at the moment - it isn't in vb.net format. I can access the first SyncHeader as strMsg.substring(0,1) and strMsg.substring(1,1) which return hex values. What ned to know is how to interprete the 4 byte dword as integer
I can't use the struct as it is at the moment - it isn't in vb.net format. I can access the first SyncHeader as strMsg.substring(0,1) and strMsg.substring(1,1) which return hex values. What ned to know is how to interprete the 4 byte dword as integer
Ok, so you have the four HEX values...
If you have the values in order, meaning byte 4 is the last HEX value if value written out like this:
0xCAC81112
You would write this as follows:
Byte1 * 16777216 '256^3
Byte2 * 65536 '256^2
Byte3 * 256 '256^1
Byte4 * 1 '256^0
Then you would sum all those up to end up with an integer value.
If you have the values in order, meaning byte 4 is the last HEX value if value written out like this:
0xCAC81112
You would write this as follows:
Byte1 * 16777216 '256^3
Byte2 * 65536 '256^2
Byte3 * 256 '256^1
Byte4 * 1 '256^0
Then you would sum all those up to end up with an integer value.
And you will first need to convert the HEX to its decimal value so this is what this looks like to be complete. Try this in VB.
Dim unitIDParts(3) As String
unitIDParts(0) = "0A"
unitIDParts(1) = "11"
unitIDParts(2) = "12"
unitIDParts(3) = "13"
Dim maxParts As Integer = unitIDParts.Length - 1
Dim intValue As Integer = 0
For i As Integer = 0 To maxParts
intValue += Math.Pow(256, maxParts - i) * System.Convert.ToUInt32(unitIDParts(i), 16)
Next
Console.WriteLine(intValue)
Console.ReadLine()
If you reverse the storage of hex values so that the last value is in index 0, then you can simplify this to be:
Math.Pow(256, i) * System.Convert.ToUInt32(un itIDParts( i), 16)
Math.Pow(256, i) * System.Convert.ToUInt32(un
ASKER
Hi
I just got to try this and it is crashing on the System.Convert.ToUInt32(un itIDParts( i), 16) command with an error System.FormatException - Could not find any recognizable digits
I just got to try this and it is crashing on the System.Convert.ToUInt32(un
ASKER
Just for info the structure value is "C8-CA-00-00-17-03-06-05"
which should vive a unit ID of 084280087
which should vive a unit ID of 084280087
The HEX from above that corresponds to unit ID should be 17030605. The decimal value of this is 386074117. This is what my code should produce if you put 17 in unitIDParts(0) ... and 05 in unitIDParts(3).
Not sure how to arrive at your answer, but maybe this will help -- shows how to go from String to HEX then you can use the above to go from HEX to decimal.
http://crossedlogic.blogspot.com/2008/09/converting-between-string-ascii-and-hex.html
Not sure how to arrive at your answer, but maybe this will help -- shows how to go from String to HEX then you can use the above to go from HEX to decimal.
http://crossedlogic.blogspot.com/2008/09/converting-between-string-ascii-and-hex.html
Make sure you are not including the "-" in your string parts as you are grabbing substring as that will not be valid HEX.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I was picking my answer up from a serial connector to the unit which transmitted the ID 084280087
ASKER
Many thanks for that - I was just begining to wonder if they were reversed - thanks for reply
Glad that worked.