Home All Groups Group Topic Archive Search About

String to Byte & Vice Versa

Author
30 Nov 2006 12:35 PM
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

Author
30 Nov 2006 1:05 PM
Herfried K. Wagner [MVP]
"Hugh Janus" <my-junk-acco***@hotmail.com> schrieb:
> 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'?

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 3:22 PM
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
Author
30 Nov 2006 3:31 PM
Herfried K. Wagner [MVP]
"Hugh Janus" <my-junk-acco***@hotmail.com> schrieb:
>> 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?

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)
///

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 3:33 PM
Hugh Janus
>I should have mentioned that I am using VB 2005.  Is there an alternative?

Oops.  I am using 2003, not 2005.
Author
30 Nov 2006 4:05 PM
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
Author
30 Nov 2006 4:26 PM
Herfried K. Wagner [MVP]
Show quote Hide quote
"roader" <roade***@gmail.com> schrieb:
>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 S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 5:48 PM
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
Author
30 Nov 2006 11:06 PM
Herfried K. Wagner [MVP]
"roader" <roade***@gmail.com> schrieb:
> I am sorry i was little lazy...

Well, you took the misleading sample from the documentation, didn't you?

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 5:51 PM
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!
--
Show quoteHide quote
"Herfried K. Wagner [MVP]" <hirf-spam-me-here@gmx.at> wrote in message
news:exYj6wJFHHA.3780@TK2MSFTNGP02.phx.gbl...
"roader" <roade***@gmail.com> schrieb:
>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 S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 11:07 PM
Herfried K. Wagner [MVP]
"Ryan S. Thiele" <mali***@verizon.net> schrieb:
> 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.

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://dotnet.mvps.org/dotnet/faqs/>
Author
30 Nov 2006 6:31 PM
Mythran
"roader" <roade***@gmail.com> wrote in message
news:1164902739.530615.271970@l39g2000cwd.googlegroups.com...
>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
Author
30 Nov 2006 7:21 PM
Branco Medeiros
Hugh Janus wrote:
> 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.
<snip>
> Private Function ArrayToString(ByVal bytes() As Byte, Optional ByVal
> format As String = Nothing) As String
<snip>

>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:
<snip>
> 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.
Author
1 Dec 2006 7:49 AM
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
Author
1 Dec 2006 1:41 PM
Branco Medeiros
Hugh Janus wrote:
<snip>
> 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.
Author
5 Dec 2006 3:24 PM
Hugh Janus
Branco Medeiros ha escrito:

> Hugh Janus wrote:
> <snip>
> > 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.

Yes.
Author
6 Dec 2006 4:09 AM
Branco Medeiros
Hugh Janus wrote:
> > Why do you need the array of bytes converted to string? Is this a
> > requirement of your encryption/decryption algorithm?
> Yes.

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.