Re: How is this conditional able to execute?
- From: "Stephany Young" <noone@localhost>
- Date: Tue, 19 Apr 2005 15:01:05 +1200
The point of the code I posted was so that you could see if you got the
EXACT same results when you executed the EXACT same code.
Simply create a new Windows Application project, plonk a button on the form
and copy and paste the code I posted into the button Click event handler,
run the project, make sure the Output window is showing, click the button
and observe the results.
If you don't get the EXACT same results a I did, then there's something else
going on that either, you don't know about or you aren't telling us about.
If you do get the EXACT same results then that will prove that the
'trimming' of the Null characters does actually work as expected on your
machine.
Remember that the chance of someone contributing to this thread having the
same hardware/software configuration as you is practically nil. There may
well be something in your configuration that is contributing to the problems
that you are observing. If that is the case then it is anyones guess as to
what it is.
Remember also, that we can only point you in the right direction. You have
to do the legwork yourself.
"Brett" <no@xxxxxxxx> wrote in message
news:%23KGoTbIRFHA.2132@xxxxxxxxxxxxxxxxxxxxxxx
>I really can't implement what you have tested here. returned data is still
>"" and its length is 8192 (depending if the 1 is subtracted). There are
>leading and trailing zeros. I'm doing
>
> Dim returndata As String =
> Trim(Encoding.UTF8.GetString(bytes).Trim(Char.MinValue))
>
> and that has no effect. returndata still has a large length and value of
> "". I follow the above line by this code, which also has no effect:
>
> returndata = Trim(returndata.Trim(Char.MinValue))
>
> debugger doesn't even run over that code. It skips to the next line.
> Rather than highlight a whole line, it only highlights parts and only runs
> on certain lines. That's another story though.
>
> Thanks,
> Brett
> "Stephany Young" <noone@localhost> wrote in message
> news:eID0C6BRFHA.3716@xxxxxxxxxxxxxxxxxxxxxxx
>> OK. So far so good
>>
>> Using the following:
>>
>> Dim _b() As Byte = New Byte(49) {0, 78, 111, 116, 104, 105, 110, 103,
>> 32, 116, 111, 32, 87, 114, 105, 116, 101, 32, 102, 114, 111, 109, 58, 32,
>> 68, 101, 118, 101, 108, 111, 112, 109, 101, 110, 116, 51, 0, 0, 0, 0, 0,
>> 0, 0, 0, 0, 0, 0, 0, 0, 0}
>>
>> Console.WriteLine("_b.Length = {0}", _b.Length)
>>
>> Dim _s As String = System.Text.Encoding.UTF8.GetString(_b)
>>
>> Console.WriteLine("_s.Length = {0}", _s.Length)
>>
>> _s = _s.Trim(Char.MinValue)
>>
>> Console.WriteLine("_s.Length (after trim) = {0}", _s.Length)
>>
>> Console.WriteLine("_s = *{0}*", _s)
>>
>> I get the following results:
>>
>> _b.Length = 50
>> _s.Length = 50
>> _s.Length (after trim) = 35
>> _s = *Nothing to Write from: Development3*
>>
>> Which is exactly what I would expect to get from the byte values you
>> supplied.
>>
>> Note that the _s.Trim(Char.MinValue) has stripped the Null character from
>> the beginning and the 14 Null characters from the end which leaves 35
>> 'good' characters (see above).
>>
>> It is the Null character at the beginning that is causing your string to
>> be interpreted as an empty string because the Null character is treated
>> as an 'end of string' marker. Any leading Null characters must be
>> 'trimmed' off and it is recommended that you 'trim' any trailing Null
>> characters as well.
>>
>>
>>
>> "Brett" <no@xxxxxxxx> wrote in message
>> news:%2326T0lBRFHA.164@xxxxxxxxxxxxxxxxxxxxxxx
>>>
>>> "Stephany Young" <noone@localhost> wrote in message
>>> news:uYXW0%23ARFHA.3364@xxxxxxxxxxxxxxxxxxxxxxx
>>>> This is getting scary :)
>>>>
>>>> Lets take this one step at a time.
>>>>
>>>> I'm a bit perplexed as to why a recieve buffer would be such a strange
>>>> size. Could it be that the value of tcpClient.ReceiveBufferSize is
>>>> actually 8192 (8KB)? If so, then the array declaration should be:
>>>>
>>>> Dim bytes(tcpClient.ReceiveBufferSize - 1) As Byte
>>>
>>> Yes - it is 8192 after putting in the above code.
>>>
>>>>
>>>> In VB.NET, arrays are 0 based and the value specified is the upper
>>>> bound of the array as opposed to the number of elements (as in C#.NET).
>>>>
>>>> Can you dump the first 50 bytes of the array on the first call.
>>>> Directly after the line:
>>>>
>>>> networkStream.Read(bytes, 0, tcpClient.ReceiveBufferSize)
>>>>
>>>> insert:
>>>>
>>>> For _i As Integer = 0 to 48
>>>> Console.Write("{0},", bytes(_i).ToString())
>>>> Next
>>>> Console.WriteLine("{0}", bytes(_i).ToString())
>>>>
>>>> Add another line:
>>>>
>>>> Console.WriteLine()
>>>>
>>>> and place a breakpoint on this line.
>>>>
>>>> Run the code then copy and paste the result into a post to this thread.
>>>
>>> When returndata is "", the above code gives this:
>>>
>>> 0,78,111,116,104,105,110,103,32,116,111,32,87,114,105,116,101,32,102,114,111,109,58,32,68,101,118,101,108,111,112,109,101,110,116,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0
>>>
>>>>
>>>> It will be interesting to see just what characters are arriving.
>>>>
>>>> A new byte array is created each time the networkStream object is read
>>>> so there is nothing from the previous red remaining. Therefore the
>>>> comment about the 'values shifting' is a red herring. What you are
>>>> getting is actually what is coming from the networkStream object.
>>>>
>>>> Also, is there any particular reason why you are using UTF8 encoding to
>>>> interpret the data? Is it specified somewhere that the data arriving in
>>>> the networkStream object is actually UTF8 or is just a stab in the
>>>> dark?
>>>
>>> Yes - I read on experts-exchange.com that this would work with Trim but
>>> it didn't. I never removed it because it didn't seem to make a
>>> difference.
>>>
>>> On the listener, I haven't declared a size that should be 8KB. I do
>>> this:
>>>
>>> Dim networkStream As NetworkStream =
>>> tcpClientObj.GetStream()
>>> ' Read the stream into a byte array
>>> Dim bytes(tcpClientObj.ReceiveBufferSize) As Byte
>>>
>>> If networkStream.DataAvailable() Then
>>> networkStream.Read(bytes, 0,
>>> CInt(tcpClientObj.ReceiveBufferSize))
>>>
>>> Dim mystring As String =
>>> Encoding.UTF8.GetString(bytes)
>>>
>>> Dim sendBytes_ As [Byte]() =
>>> Encoding.ASCII.GetBytes(mystring)
>>>
>>> networkStream.Write(sendBytes_, 0, sendBytes_.Length)
>>> sendBytes_.Clear(sendBytes_, 0, sendBytes_.GetLength(0))
>>>
>>>>
>>>>
>>>> "Brett" <no@xxxxxxxx> wrote in message
>>>> news:%23aS0EDARFHA.2744@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>I tried this but it isn't working either. At one point, the bytes
>>>>>array has non zero elements up to element 35. returndata has the value
>>>>>of "" (or so it seems) and length of 8193, same as the bytes array.
>>>>>Through each pass of the loop, the non zero elements increase in the
>>>>>bytes array. So it goes from element 35 to 36, 37 and so on. The
>>>>>values are shifting so that the first 10 are now zero. Then the first
>>>>>11, 12, 13 and so on.
>>>>>
>>>>> Any other suggestions?
>>>>>
>>>>> Thanks,
>>>>> Brett
>>>>>
>>>>> "Stephany Young" <noone@localhost> wrote in message
>>>>> news:u1TlDb9QFHA.2680@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>> Sorry, my mistake. Null (Chr(0)) is not treated as whitespace by the
>>>>>> String.Trim Method.
>>>>>>
>>>>>> Instead, you can can use one of the overloaded String.Trim methods.
>>>>>>
>>>>>> Dim returndata As String =
>>>>>> Encoding.UTF8.GetString(bytes).Trim(Char.MinValue)
>>>>>>
>>>>>> Char.MinValue is a constant for 0x00 which equates to Null or Chr(0).
>>>>>>
>>>>>> This overload removes all occurrences of a set of characters
>>>>>> specified in an array from the beginning and end of the string
>>>>>> instance.
>>>>>>
>>>>>>
>>>>>> "Brett" <no@xxxxxxxx> wrote in message
>>>>>> news:uPLcAZ6QFHA.3988@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>>>
>>>>>>> "Stephany Young" <noone@localhost> wrote in message
>>>>>>> news:%23hNf834QFHA.3988@xxxxxxxxxxxxxxxxxxxxxxx
>>>>>>>> What test are you using to determine that returndata.ToString = ""?
>>>>>>>>
>>>>>>>> Are you , for example, executing a:
>>>>>>>>
>>>>>>>> Console.Writeline("returndata.ToString = " &
>>>>>>>> returndata.ToString)
>>>>>>>>
>>>>>>>> and getting the result:
>>>>>>>>
>>>>>>>> returndata.ToString =
>>>>>>>>
>>>>>>>> Your comment about returndata 'always' being 8193 bytes gives us
>>>>>>>> the clue as what is happening.
>>>>>>>>
>>>>>>>> I suspect that returndata is padded with null characters (chr(0)).
>>>>>>>>
>>>>>>>> The Trim function (aka Microsoft.VisualBasic.Trim) only 'trims'
>>>>>>>> leading and trailing Space characters.
>>>>>>>>
>>>>>>>> The String.Trim Method 'trims' leading and trailing whitespace
>>>>>>>> characters. 'whitespace' comprises a number of characters including
>>>>>>>> the null character (chr(0)).
>>>>>>>>
>>>>>>>> I think that if you change the line:
>>>>>>>>
>>>>>>>> Dim returndata As String = Trim(Encoding.UTF8.GetString(bytes))
>>>>>>>>
>>>>>>>> to
>>>>>>>>
>>>>>>>> Dim returndata As String = Encoding.UTF8.GetString(bytes).Trim()
>>>>>>>>
>>>>>>>> then the test will work correctly.
>>>>>>>
>>>>>>> That doesn't work either. In some cases, bytes will come in as a
>>>>>>> zero byte array with length 8193. Every element in that array will
>>>>>>> be zero. returndata is assigned and its length becomes 8193 as well.
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
.
- Follow-Ups:
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- References:
- How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- Re: How is this conditional able to execute?
- From: Stephany Young
- Re: How is this conditional able to execute?
- From: Brett
- How is this conditional able to execute?
- Prev by Date: Re: Why is handles on event missing?
- Next by Date: RE: Tips for speeding up Visual Studio .NET 2003
- Previous by thread: Re: How is this conditional able to execute?
- Next by thread: Re: How is this conditional able to execute?
- Index(es):