Groups | Blog | Home
all groups > vb.net > january 2005 >

vb.net : How to Convert Byte Array to Int32 (Big-endian)


Charles Law
1/21/2005 11:02:17 AM
I thought this had come up before, but I now cannot find it.

I have a byte array, such as

Dim a() As Byte = {1, 2, 3, 4}

I want to convert this to an Int32 = 01020304 (hex).

If I use BitConverter, I get 04030201.

Is there a built-in way to do this, or am I stuck with extracting and
shifting each byte manually?

TIA

Charles

Jay B. Harlow [MVP - Outlook]
1/21/2005 11:37:47 AM
Charles,
Jon Skeet has a EndianBitConverter at
http://www.yoda.arachsys.com/csharp/miscutil/ that works similar to
BitConverter but either Little-Endian or Big-Endian depending on which you
pick...

Its in C#, however you should be able to use directly as a class assembly,
or easily converted to VB.NET as the source is available...

Hope this helps
Jay

[quoted text, click to view]

Charles Law
1/21/2005 1:51:28 PM
Hi Cor

I haven't really been away, just a bit quiet. I did respond to someone the
other day about a serial comms issue crashing their prog, but no word yet
whether it fixed the problem.

[quoted text, click to view]

Yes, that is currently what I do, or rather what the VB6 code that I am
converting does. I was just looking for a native .NET way to do it. It seems
to me that there should be a switch, or extra parameter to pass that allows
one to specify big or little-endianness, but I haven't spotted it.

Charles


[quoted text, click to view]

Charles Law
1/21/2005 1:56:34 PM
Hi Herfried

As I have just replied to Cor, I kind of expected a switch somewhere to
allow me to specify the endianness of the operation, but it seems to be
fixed.

I had toyed with reversing the bytes, but then I might just as well stick to
carving the array up by hand. Besides, it makes it a two-stage process, so
to avoid duplication I would need a function wrapper.

Perhaps I am just being picky, but I like to use built-in stuff wherever
possible; or maybe it's laziness ;-)

Charles


[quoted text, click to view]

Cor Ligthert
1/21/2005 2:00:33 PM
Charles,

We have a long time not seen you, so welcome back,

Maybe a crazy idea for you, however multiplying and adding?

Cor

Herfried K. Wagner [MVP]
1/21/2005 2:06:19 PM
"Charles Law" <blank@nowhere.com> schrieb:
[quoted text, click to view]

You may want to reverse the byte array before using 'BitConverter'.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
Dennis
1/21/2005 3:55:02 PM
Here's a couple of functions that I use...probably a better way to do it but
it works:

Friend Function ConvIntegertoByteArray(ByVal n As Long, ByVal lg As
Integer) As Byte()
'converts an integer to a byte array of length lg
Dim m() As Byte = New Byte(lg - 1) {}
Dim i, k As Integer
Dim h As String
h = Hex(n).PadLeft(16, "0"c)
k = 16
For i = lg - 1 To 0 Step -1
k = k - 2
m(i) = CByte("&H" & h.Substring(k, 2))
Next
Return m
End Function

Public Function ConvByteArraytoInteger(ByVal b As Byte(), Optional ByVal
ln As Integer = 0, Optional ByVal sidx As Integer = 0) As Long
Dim i As Integer
Dim j, k As Long
If ln = 0 Then ln = UBound(b) + 1
ln = sidx + ln - 1
k = 1
j = CInt(b(ln))
For i = ln - 1 To sidx Step -1
k = 256 * k
j = j + k * b(i)
Next
Return j
End Function

[quoted text, click to view]
Charles Law
1/22/2005 12:06:10 AM
Hi Dennis

Thanks for the reply. As I said in a couple of other replies, it is not so
much the ability to manipulate the data by hand that eludes me, but the
native .NET way, if any. I suppose I am jut trying to avoid re-inventing the
wheel if, indeed, such a wheel exists.

Charles


[quoted text, click to view]

Charles Law
1/22/2005 2:15:12 AM
Hi Jay

Thanks for the link. I have had a look and I see that Jon uses, in essence,
the same approach that I have at present. I guess that is also how the .NET
little endian BitConverter method is coded under the covers, so it seems
that my best bet is just to wrap the functions I have a bit better and leave
it at that.

Cheers.

Charles


[quoted text, click to view]

Jay B. Harlow [MVP - Outlook]
1/23/2005 9:30:22 AM
Charles,
I would expect yours & Jon's approach to be very similar.

My point is that Jon has done all the "leg work" & created "complete"
versions of the classes. In other words Why reinvent the wheel?

Hope this helps
Jay

[quoted text, click to view]

Charles Law
1/23/2005 3:52:23 PM
Indeed. Fair point.

Thanks.

Charles


[quoted text, click to view]

Gerald Hernandez
1/24/2005 10:31:12 AM

[quoted text, click to view]

You could try something like this:

Private Function Int32FromByteArray(ByVal BA() As Byte, ByVal
SwitchEndian As Boolean) As Integer
Dim outVal As Integer

outVal = BitConverter.ToInt32(BA, 0)
If SwitchEndian = True Then
outVal = System.Net.IPAddress.NetworkToHostOrder(outVal)
End If
Return outVal
End Function

NetworkToHostOrder - Big To Little Endian
HostToNetworkOrder - Little To Big Endian
Although in this case it makes no difference which one you choose as the end
result is the same.

Gerald

Gerald Hernandez
1/24/2005 1:17:42 PM
Yeah, it is buried pretty deep. It also seems they have some sort of
aversion to using the word Endian, so it makes it very difficult to find.

Gerald

[quoted text, click to view]

Jay B. Harlow [MVP - Outlook]
1/24/2005 1:28:54 PM
Gerald,
Thanks, I was looking for NetworkToHostOrder & HostToNetworkOrder, when
Charles first asked, I just didn't remember which System.Net class they were
on. I was thinking Socket or something else...

Jay

[quoted text, click to view]

Charles Law
1/24/2005 10:24:16 PM
Hi Gerald

That's just the ticket. Thanks.

Charles


[quoted text, click to view]

AddThis Social Bookmark Button