How to Convert Binary Coded Hex Byte Array to Byte

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

Charles Law

I thought this was going to be straight forward, given the wealth of
conversion functions in .NET, but it is proving more convoluted than
imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a succinct
conversion for it]
 
* "Charles Law said:
I thought this was going to be straight forward, given the wealth of
conversion functions in .NET, but it is proving more convoluted than
imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a succinct
conversion for it]

There can be many functions...

\\\
Public Function Foo(ByVal abyt() As Byte) As Byte
Return &H40
End Function
///

SCNR
 
Hi Herfried

As I was making coffee I realised my mistake (in the post). It should read

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h34
ba(1) = &h30

b = foo(ba)
</code>

Still looking for foo() such that b contains &h40.

Charles


Herfried K. Wagner said:
* "Charles Law said:
I thought this was going to be straight forward, given the wealth of
conversion functions in .NET, but it is proving more convoluted than
imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a succinct
conversion for it]

There can be many functions...

\\\
Public Function Foo(ByVal abyt() As Byte) As Byte
Return &H40
End Function
///

SCNR
 
Correction

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h34
ba(1) = &h30

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
 
Charles Law said:
I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Hi Armin

Sorry for the confusion, but I think my correction is a bit slow coming
through. I should have written

ba(0) = &h34
ba(1) = &h30

Charles


Armin Zingler said:
Charles Law said:
I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
* "Charles Law said:
Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h34
ba(1) = &h30

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

There are still thousands of ways to return this result. Do you have
other (input, outpuut) pairs?
 
Charles Law said:
Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)

Sorry for the confusion, but I think my correction is a bit slow
coming through. I should have written

ba(0) = &h34
ba(1) = &h30

Expected result? &H3430?

Dim ba(1) As Byte
Dim s As Short

ba(0) = &H34
ba(1) = &H30

s = CShort(ba(0)) << 8 Or ba(1)


If you can exchange the byte order, this is also possible:

s = System.BitConverter.ToInt16(ba, 0)



--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Thousands? I only need one ;-)

This is currently the only scenario. As a stop-gap, I have

<code>
Dim enc As New Text.ASCIIEncoding

Return CByte("&H" & enc.GetString(ba))
</code>

which I imagine you will say is as good as any, but prepending "&H" to the
string just seems a bit 'kludgy'.

Charles
 
Hi Armin

No. Expected result still &H40.

Unfortunately, I cannot easily change the byte order as these are sent to me
from an external source, as binary coded hex digits.

Charles


Armin Zingler said:
Charles Law said:
Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)

Sorry for the confusion, but I think my correction is a bit slow
coming through. I should have written

ba(0) = &h34
ba(1) = &h30

Expected result? &H3430?

Dim ba(1) As Byte
Dim s As Short

ba(0) = &H34
ba(1) = &H30

s = CShort(ba(0)) << 8 Or ba(1)


If you can exchange the byte order, this is also possible:

s = System.BitConverter.ToInt16(ba, 0)



--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Charles,
Use Armin's code, only anding with &hf first.

Public Function Foo(ByVal bytes() As Byte) As Byte
Const mask As Byte = &HF
Return (bytes(0) And mask) << 4 Or (bytes(1) And mask)
End Function

Hope this helps
Jay

Charles Law said:
Hi Armin

Sorry for the confusion, but I think my correction is a bit slow coming
through. I should have written

ba(0) = &h34
ba(1) = &h30

Charles


Armin Zingler said:
Charles Law said:
I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Hi Jay

Thanks. I was trying to avoid byte shifting and masking if possible. I had
hoped that there was a higher level solution, using a combination of the
Convert class and perhaps Encoding/Decoding. There seem to be so many ways
of performing conversions that I thought there must be one to translate
binary code hex. For example, what about foo() where

Dim s As String
Dim b As Byte

s = "40"

b = foo(s)

to give b equal to &H40. Clearly, I can put &H on the beginning of the
string and use CByte(), as I put in my response to Herfried, but that just
seems low-tech. After all, there is a way to create a hex string from a
byte:

Convert.ToString(&H40, 16) gives "40"

so isn't there something to do the reverse?

Charles


Jay B. Harlow said:
Charles,
Use Armin's code, only anding with &hf first.

Public Function Foo(ByVal bytes() As Byte) As Byte
Const mask As Byte = &HF
Return (bytes(0) And mask) << 4 Or (bytes(1) And mask)
End Function

Hope this helps
Jay

Charles Law said:
Hi Armin

Sorry for the confusion, but I think my correction is a bit slow coming
through. I should have written

ba(0) = &h34
ba(1) = &h30

Charles


Armin Zingler said:
I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Charles Law said:
No. Expected result still &H40.


How do you get &H40 from &H34 and &H30 ??


Aaah.. now I understand. Both values are character codes. You should have
mentioned! :-)

dim b as byte

b = System.Convert.ToByte(Chr(ba(0)) & Chr(ba(1)), 16)

Or, for performance reasons:

Dim c(1) As Char
c(0) = Convert.ToChar(ba(0))
c(1) = Convert.ToChar(ba(1))
b = System.Convert.ToByte(New String(c), 16)

You may also consider declaring c as static (static c(1) as char).


.....


Another (untested!) version:

Private Function foo(ByVal b As Byte()) As Byte
Static b0, b1 As Byte

Select Case b(0)
Case Is > 70
b0 = b(0) - CByte(87)
Case Is > 57
b0 = b(0) - CByte(55)
Case Else
b0 = b(0) - CByte(48)
End Select

Select Case b(1)
Case Is > 70
b1 = b(1) - CByte(87)
Case Is > 57
b1 = b(1) - CByte(55)
Case Else
b1 = b(1) - CByte(48)
End Select


Return (b0 << 4) Or b1

End Function



--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Charles,
Thanks. I was trying to avoid byte shifting and masking if possible. I had
Only via the various methods previously mentioned (BitConverter)
Convert.ToString(&H40, 16) gives "40"
so isn't there something to do the reverse?

You mean?

Dim s As String = b.ToString("X")

Hope this helps
Jay

Charles Law said:
Hi Jay

Thanks. I was trying to avoid byte shifting and masking if possible. I had
hoped that there was a higher level solution, using a combination of the
Convert class and perhaps Encoding/Decoding. There seem to be so many ways
of performing conversions that I thought there must be one to translate
binary code hex. For example, what about foo() where

Dim s As String
Dim b As Byte

s = "40"

b = foo(s)

to give b equal to &H40. Clearly, I can put &H on the beginning of the
string and use CByte(), as I put in my response to Herfried, but that just
seems low-tech. After all, there is a way to create a hex string from a
byte:

Convert.ToString(&H40, 16) gives "40"

so isn't there something to do the reverse?

Charles


Jay B. Harlow said:
Charles,
Use Armin's code, only anding with &hf first.

Public Function Foo(ByVal bytes() As Byte) As Byte
Const mask As Byte = &HF
Return (bytes(0) And mask) << 4 Or (bytes(1) And mask)
End Function

Hope this helps
Jay

Charles Law said:
Hi Armin

Sorry for the confusion, but I think my correction is a bit slow coming
through. I should have written

ba(0) = &h34
ba(1) = &h30

Charles


I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Armin,
How do you get &H40 from &H34 and &H30 ??

Aaah.. now I understand. Both values are character codes. You should have
mentioned! :-)

Aaah! indeed...

I was thinking zoned decimal which is the AS/400 mainframe (read EBCDIC)
equivalent...

Hopefully Charles has enough ideas to find one that fits what he needs.

Jay
 
Hi Jay

I don't think I do. In my example I was trying to show a byte being
converted to its hex string representation (w/o the &H). So the reverse I
was looking for was a hex string being converted to its byte equivalent. As
I say, I can put &H on the front and use CByte(), but that is cheating
really, and not an exact reversal as it requires some tampering with the
string to achieve the effect.

Charles


Jay B. Harlow said:
Charles,
Thanks. I was trying to avoid byte shifting and masking if possible. I
had
Only via the various methods previously mentioned (BitConverter)
Convert.ToString(&H40, 16) gives "40"
so isn't there something to do the reverse?

You mean?

Dim s As String = b.ToString("X")

Hope this helps
Jay

Charles Law said:
Hi Jay

Thanks. I was trying to avoid byte shifting and masking if possible. I had
hoped that there was a higher level solution, using a combination of the
Convert class and perhaps Encoding/Decoding. There seem to be so many ways
of performing conversions that I thought there must be one to translate
binary code hex. For example, what about foo() where

Dim s As String
Dim b As Byte

s = "40"

b = foo(s)

to give b equal to &H40. Clearly, I can put &H on the beginning of the
string and use CByte(), as I put in my response to Herfried, but that just
seems low-tech. After all, there is a way to create a hex string from a
byte:

Convert.ToString(&H40, 16) gives "40"

so isn't there something to do the reverse?

Charles


Charles,
Use Armin's code, only anding with &hf first.

Public Function Foo(ByVal bytes() As Byte) As Byte
Const mask As Byte = &HF
Return (bytes(0) And mask) << 4 Or (bytes(1) And mask)
End Function

Hope this helps
Jay

Hi Armin

Sorry for the confusion, but I think my correction is a bit slow coming
through. I should have written

ba(0) = &h34
ba(1) = &h30

Charles


I thought this was going to be straight forward, given the wealth
of conversion functions in .NET, but it is proving more convoluted
than imagined.

Given the following

<code>
Dim ba(1) As Byte
Dim b As Byte

ba(0) = &h4
ba(1) = &h0

b = foo(ba)
</code>

What is foo() such that b contains &h40 ?

TIA

Charles
[I could write an algorithm for this, but there must surely be a
succinct conversion for it]


What if ba(0) or ba(1) > &Hf?

If both are [0; &HF]:

b = ba(0) << 4 or ba(1)


--
Armin

How to quote and why:
http://www.plig.net/nnq/nquote.html
http://www.netmeister.org/news/learn2quote.html
 
Hmm. You're going to think I am hard to please, but it doesn't quite do it
for me yet.

I prefer the latter, but it involves processing each element individually,
which troubles me.

I posted the following in response to Herfried

<code>
Dim enc As New Text.ASCIIEncoding

Return CByte("&H" & enc.GetString(ba))
</code>

which is more on the lines of what I was hoping for, but I am still unhappy
with the prepending of &H. If I could find a way w/o having to do that then
I think I would say I had taken it as far as I could.

Charles
 
It's actually a programmable power supply, that returns its status as a 2
byte hex string, and "40" (bit 6 set) means that the output has been
switched off from the front panel.

I realise that probably doesn't help, but I thought you might be interested
to know ;-)

Charles
 
Charles,
If "bit 6" has meaning I would convert the 2 byte hex string, to an Enum.
Then define an Enum to be what the different bit positions are:

<Flags()> _
Public Enum Status
Off = &h40
End Enum

I would include FlagsAttribute if you can get more then one status at a
time, if you can only have a single status at a time, I would not include
the FlagsAttribute.

I would define the enum such that BitConverter converted the bits
correctly...

Hope this helps
Jay
 
Back
Top