How to Convert Byte Array to Int32 (Big-endian)

  • Thread starter Thread starter Charles Law
  • Start date Start date
C

Charles Law

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
 
Charles,

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

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

Cor
 
Charles Law said:
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?

You may want to reverse the byte array before using 'BitConverter'.
 
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.
Maybe a crazy idea for you, however multiplying and adding?

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
 
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
 
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
 
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
 
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
 
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
 
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
 
Indeed. Fair point.

Thanks.

Charles


Jay B. Harlow said:
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
 
Charles Law said:
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

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,
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
 
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top