469,117 Members | 1,301 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,117 developers. It's quick & easy.

String to Byte & Vice Versa

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

Nov 30 '06 #1
16 1901
"Hugh Janus" <my*************@hotmail.comschrieb:
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/>

Nov 30 '06 #2
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

Nov 30 '06 #3
"Hugh Janus" <my*************@hotmail.comschrieb:
>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/>

Nov 30 '06 #4
>I should have mentioned that I am using VB 2005. Is there an alternative?

Oops. I am using 2003, not 2005.

Nov 30 '06 #5
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

Nov 30 '06 #6
"roader" <ro******@gmail.comschrieb:
>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/>
Nov 30 '06 #7
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

Nov 30 '06 #8
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!
--
"Herfried K. Wagner [MVP]" <hi***************@gmx.atwrote in message
news:ex**************@TK2MSFTNGP02.phx.gbl...
"roader" <ro******@gmail.comschrieb:
>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/>
Nov 30 '06 #9


"roader" <ro******@gmail.comwrote in message
news:11**********************@l39g2000cwd.googlegr oups.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
Nov 30 '06 #10
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.

Nov 30 '06 #11
"Ryan S. Thiele" <ma*****@verizon.netschrieb:
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/>
Nov 30 '06 #12
"roader" <ro******@gmail.comschrieb:
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/>
Nov 30 '06 #13
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

Dec 1 '06 #14

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.

Dec 1 '06 #15

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.

Dec 5 '06 #16
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.

Dec 6 '06 #17

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Matthias S. | last post: by
7 posts views Thread by Eric | last post: by
1 post views Thread by Eugene Anthony | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.