String to Byte & Vice Versa

H

Hugh Janus

Hi all,

I am using the below functions in order to convert strings to bytes and
vice versa. I totally ans shamefully stole these functions from this
group btw! Anyway, they work great but as sooooo slow. Anyone know
how I can speed this functions up? I basically need to convert a byte
to string, perform a function on each 'section' of the string, then
reconvert it to a byte. The slow part is the conversion to and from
byte, not the part I am doing in between after conversion.

TIA


Private Function ArrayToString(ByVal bytes() As Byte, Optional ByVal
format As String = Nothing) As String

If bytes.Length = 0 Then Return String.Empty

Dim sb As New System.Text.StringBuilder(bytes.Length * 4)

For Each b As Byte In bytes

sb.Append(b.ToString(format))
sb.Append(","c)

Next

sb.Length -= 1

Return sb.ToString()

End Function

Private Function StringToArray(ByVal s As String, Optional ByVal
style As System.Globalization.NumberStyles = Nothing) As Byte()

If s.Length = 0 Then Return New Byte() {}

Dim values() As String = s.Split(","c)

Dim bytes(values.Length - 1) As Byte

For index As Integer = 0 To values.Length - 1

bytes(index) = Byte.Parse(EncStr, style)
bytes(index) = Byte.Parse(values(index), style)

Next

Return bytes

End Function
 
H

Herfried K. Wagner [MVP]

Hugh Janus said:
I am using the below functions in order to convert strings to bytes and
vice versa. I totally ans shamefully stole these functions from this
group btw! Anyway, they work great but as sooooo slow.

Why not use
'System.Text.Encoding.GetString'/'System.Text.Encoding.GetBytes'?
 
H

Hugh Janus

Why not use
'System.Text.Encoding.GetString'/'System.Text.Encoding.GetBytes'?

I don't have that so I assume it is in the 2.0 framework. I should
have mentioned that I am using VB 2005. Is there an alternative?

TIA
 
H

Herfried K. Wagner [MVP]

Hugh Janus said:
I don't have that so I assume it is in the 2.0 framework. I should
have mentioned that I am using VB 2005. Is there an alternative?

Yes, it's available since .NET 1.0. You'll have to specify the encoding you
want to use:

\\\
Imports System.Text
....
Dim s As String = "Hello World"
Dim b() As Byte = Encoding.Unicode.GetBytes(s)
s = Encoding.Unicode.GetString(b)
MsgBox(s)
///
 
H

Hugh Janus

I should have mentioned that I am using VB 2005. Is there an alternative?

Oops. I am using 2003, not 2005.
 
R

roader

I am using 2003 too
instead of using class names u just have to use instances (because its
a shared function)

This will compile

I didn't run it ...any way try it

Dim instance As System.Text.Encoding
Dim bytes As Byte()
Dim returnValue As String

returnValue = instance.GetString(bytes)

for more info check this link

http://msdn2.microsoft.com/en-us/library/744y86tc.aspx
 
H

Herfried K. Wagner [MVP]

roader said:
I am using 2003 too
instead of using class names u just have to use instances (because its
a shared function)

This will compile

I didn't run it ...any way try it

Dim instance As System.Text.Encoding
Dim bytes As Byte()
Dim returnValue As String

returnValue = instance.GetString(bytes)

.... but it will throw a 'NullReferenceException' at runtime :).
 
R

roader

This code will work .....
I am sorry i was little lazy...

Dim instance As System.Text.Encoding = System.Text.Encoding.UTF8

Dim returnValue As String
Dim b As Byte() = {&H34, &H56, &HAA, &H55, &HFF}
returnValue = ""

returnValue = instance.GetString(b)
MsgBox(returnValue)


Best of luck
 
R

Ryan S. Thiele

This is done is both vb2005 and vb2003.
Be sure to add the 'System.Text' Reference to your project

Imports System.Text 'Import the text namespace

Public sub ConvertStringToByte(StringToConvert as string)
Dim b() as byte 'A byte array
b = Encoding.GetBytes(StringToConvert)
end sub

'Convert Byte To String

Public Sub CovertByteToString(BytesToConvert() as byte)
Dim s as string 'An empty string
s = Encoding.Text.GetString(BytesToConvert)
end sub

Hope this awnsers your question. Good Luck!




--
--
Thiele Enterprises - The Power Is In Your Hands Now!
--
roader said:
I am using 2003 too
instead of using class names u just have to use instances (because its
a shared function)

This will compile

I didn't run it ...any way try it

Dim instance As System.Text.Encoding
Dim bytes As Byte()
Dim returnValue As String

returnValue = instance.GetString(bytes)

.... but it will throw a 'NullReferenceException' at runtime :).
 
M

Mythran

roader said:
I am using 2003 too
instead of using class names u just have to use instances (because its
a shared function)

Huh? You have to use instances "because it’s a shared function"??? A
shared method means you don't use an instance, you use a class name :)
Although, in VB.Net you can use instance variables to call shared methods
(which I think shouldn't be allowed, but it is)..
This will compile

I didn't run it ...any way try it

Dim instance As System.Text.Encoding
Dim bytes As Byte()
Dim returnValue As String

returnValue = instance.GetString(bytes)

Why not just System.Text.Encoding.UTF8.GetString(bytes)?

HTH,
Mythran
 
B

Branco Medeiros

Hugh said:
I am using the below functions in order to convert strings to bytes and
vice versa. I totally ans shamefully stole these functions from this
group btw! Anyway, they work great but as sooooo slow.
Private Function ArrayToString(ByVal bytes() As Byte, Optional ByVal
format As String = Nothing) As String
Private Function StringToArray(ByVal s As String, Optional ByVal
style As System.Globalization.NumberStyles = Nothing) As Byte()
<snip>

To what Herfried K. Wagner [MVP] responded:
Why not use
'System.Text.Encoding.GetString'/'System.Text.Encoding.GetBytes'?

It seems the OP is trying something different. In other words, given a
byte sequence of, say {100, 120, 200, 1, 2, ...}, the OP needs to
convert it to the string "100,120,200..." and, eventually, back again
to bytes.

The original methods seem ok to me. If you want to speed them up,
though, maybe you'll have to let go the formatting parameters and live
with more simplistic functions. A possible (and radical) approach could
be:

<code>
Function FromString(ByVal Source As String) As Byte()
'converts a string in the format "123,211,0,45...",
'to an array of bytes {123, 211, 0, 45,...}

If Source Is Nothing OrElse Source.Length = 0 Then
Return New Byte() {}
End If

'Counts the number of ","
'to find the number of bytes to convert
'(!)
Dim Count As Integer = 1
For Each C As Char In Source
If C = ","c Then Count += 1
Next

Dim Bytes(0 To Count - 1) As Byte

Dim AscZero As Integer = Asc("0"c)
Dim Value As Byte
Dim Index As Integer

For Each C As Char In Source
'Converts each char to the corresponding byte value
If C <> ","c Then
Value = CByte(Value * 10 + (Asc(C) - AscZero))
Else
Bytes(Index) = Value
Index += 1
Value = 0
End If
Next
'Saves the last value
Bytes(Index) = Value
Return Bytes
End Function

Function FromBytes(ByVal Source() As Byte) As String
'Converts an array of bytes in a string in the format
'"123,211,0,45...", where 123, 211, 0, etc are the
'bytes from the array

If Source Is Nothing OrElse Source.Length = 0 Then
Return String.Empty
End If

'Assumes each number occupies 3 digits and is comma
'separated. We probably will need less space than this
Dim Chars(0 To Source.Length * 4 - 1) As Char

'Starts from the end of the array
Dim Index As Integer = Chars.Length - 1
Dim AscZero As Integer = Asc("0"c)

'Saves the converted chars from the end to the
'begining of the string
For P As Integer = Source.Length - 1 To 0 Step -1
Dim B As Integer = Source(P)
If B <> 0 Then
'Manually converts B to string, from right
'to left (i.e. less significant digits first)
Do While B > 0
Chars(Index) = Chr(AscZero + B Mod 10)
B \= 10
Index -= 1
Loop
Else
Chars(Index) = "0"c
Index -= 1
End If
Chars(Index) = ","c
Index -= 1
Next
'Advances Index to point to the first digit
Index += 2

Return New String(Chars, Index, Chars.Length - Index)
End Function
</code>

HTH

Regards,

Branco.
 
H

Herfried K. Wagner [MVP]

Ryan S. Thiele said:
This is done is both vb2005 and vb2003.
Be sure to add the 'System.Text' Reference to your project

There's no such reference required.
 
H

Hugh Janus

It seems the OP is trying something different. In other words, given a
byte sequence of, say {100, 120, 200, 1, 2, ...}, the OP needs to
convert it to the string "100,120,200..." and, eventually, back again
to bytes.

The original methods seem ok to me. If you want to speed them up,
though, maybe you'll have to let go the formatting parameters and live
with more simplistic functions. A possible (and radical) approach could
be:

Precisely! Basically, I am sending a file over TCP by reading it in
and sending it as a stream. Before sendind, I need to encrypt the
information so I take the byte sequence and convert it to a string
seperated by commas. Whilst building the string, I encrypt each part
first then add it to the string. Then I convert it back to a byte.

Likewise, to decrypt is the same procedure almost. I have it working
but it is so slow. For example, I can send 10mb in about 8 seconds on
the LAN but with encrypting takes about 5 minutes. Any idea how I can
speed up what I have or if there is a faster way to do it? The
slowdown is the conversion, not the encrypting which is almost instant.

TIA
 
B

Branco Medeiros

Hugh Janus wrote:
Precisely! Basically, I am sending a file over TCP by reading it in
and sending it as a stream. Before sendind, I need to encrypt the
information so I take the byte sequence and convert it to a string
seperated by commas. Whilst building the string, I encrypt each part
first then add it to the string. Then I convert it back to a byte.
<snip>

Why do you need the array of bytes converted to string? Is this a
requirement of your encryption/decryption algorithm?

B.
 
H

Hugh Janus

Branco Medeiros ha escrito:
Hugh Janus wrote:

<snip>

Why do you need the array of bytes converted to string? Is this a
requirement of your encryption/decryption algorithm?

B.

Yes.
 
B

Branco Medeiros

Hugh said:

I supose that if you could just pass the raw bytes to encryption it
would really solve the timing problem.

If not, then a much better alternative may be to use
System.Convert.ToBase64String(). It's *really* fast and will even give
you a smmaler string.

To convert the bytes to string you'd use:

TheString = System.Convert.ToBase64String(ByteArray)

And to convert the string back to bytes, it'd be:

ByteArray = System.Convert.FromBase64String(TheString)

In case you don't know, Base64 is the encoding used when you want to
transmit raw bytes through a medium that only deals with ASCII. The
encoded bytes are turned into a string made only of the chars A-Z, a-z,
the digits 0-9 and the symbols '+' and '/'. This string has usually 30%
more chars than the original array byte count.


HTH.

Regards,

Branco.
 

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

Top