|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
String to Byte & Vice VersaI 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 "Hugh Janus" <my-junk-acco***@hotmail.com> schrieb: Why not use > 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. '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/> > Why not use I don't have that so I assume it is in the 2.0 framework. I should> 'System.Text.Encoding.GetString'/'System.Text.Encoding.GetBytes'? > have mentioned that I am using VB 2005. Is there an alternative? TIA "Hugh Janus" <my-junk-acco***@hotmail.com> schrieb: Yes, it's available since .NET 1.0. You'll have to specify the encoding you >> 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? 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/> >I should have mentioned that I am using VB 2005. Is there an alternative? Oops. I am using 2003, not 2005.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
Show quote
Hide quote
"roader" <roade***@gmail.com> schrieb: .... but it will throw a 'NullReferenceException' at runtime :-).>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) -- M S Herfried K. Wagner M V P <URL:http://dotnet.mvps.org/> V B <URL:http://dotnet.mvps.org/dotnet/faqs/> 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 "roader" <roade***@gmail.com> schrieb: Well, you took the misleading sample from the documentation, didn't you?> I am sorry i was little lazy... -- M S Herfried K. Wagner M V P <URL:http://dotnet.mvps.org/> V B <URL:http://dotnet.mvps.org/dotnet/faqs/> 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! -- Show quoteHide quote-- Thiele Enterprises - The Power Is In Your Hands Now! -- "Herfried K. Wagner [MVP]" <hirf-spam-me-here@gmx.at> wrote in message .... but it will throw a 'NullReferenceException' at runtime :-).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) -- M S Herfried K. Wagner M V P <URL:http://dotnet.mvps.org/> V B <URL:http://dotnet.mvps.org/dotnet/faqs/> "Ryan S. Thiele" <mali***@verizon.net> schrieb: There's no such reference required.> This is done is both vb2005 and vb2003. > Be sure to add the 'System.Text' Reference to your project -- M S Herfried K. Wagner M V P <URL:http://dotnet.mvps.org/> V B <URL:http://dotnet.mvps.org/dotnet/faqs/> "roader" <roade***@gmail.com> wrote in message Huh? You have to use instances "because it’s a shared function"??? A 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) 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).. > Why not just System.Text.Encoding.UTF8.GetString(bytes)?> 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) HTH, Mythran Hugh Janus wrote:
> I am using the below functions in order to convert strings to bytes and <snip>> 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 <snip>> format As String = Nothing) As String >Private Function StringToArray(ByVal s As String, Optional ByVal <snip>> style As System.Globalization.NumberStyles = Nothing) As Byte() To what Herfried K. Wagner [MVP] responded: <snip> > Why not use It seems the OP is trying something different. In other words, given a> 'System.Text.Encoding.GetString'/'System.Text.Encoding.GetBytes'? > 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. > It seems the OP is trying something different. In other words, given a Precisely! Basically, I am sending a file over TCP by reading it in> 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: 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 Hugh Janus wrote:
<snip> > Precisely! Basically, I am sending a file over TCP by reading it in <snip>> 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. Why do you need the array of bytes converted to string? Is this a requirement of your encryption/decryption algorithm? B. Branco Medeiros ha escrito:
> Hugh Janus wrote: Yes.> <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. Hugh Janus wrote:
> > Why do you need the array of bytes converted to string? Is this a I supose that if you could just pass the raw bytes to encryption it> > requirement of your encryption/decryption algorithm? > Yes. 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.
VB vs. C# language challenge question
Full Screen Dropping folder on desk top icon Best way to communicate from Desktop to SQL DB Re: Is VB.NET Stable?? Create Property on the fly Re: Is VB.NET Stable?? Delete Selected Lines from Text File loading treeview dynamically is very slow load external html vs 2005 |
|||||||||||||||||||||||