كيف أحصل على طول (أي عدد الأحرف) لسلسلة ASCII في vb.net؟

StackOverflow https://stackoverflow.com/questions/1005164

سؤال

أنا أستخدم هذا الرمز لإرجاع بعض السلسلة من TCPClient ولكن عندما تعود السلسلة ، فإنها تحتوي على قيادة " شخصية في ذلك. أحاول إزالته ولكن Len() الوظيفة هي قراءة عدد البايتات بدلاً من السلسلة نفسها. كيف يمكنني تغيير هذا لإعطائي طول السلسلة لأنني عادةً ما أستخدمها وليس من الصفيف الكامن وراء السلسلة نفسها؟

 Dim bytes(tcpClient.ReceiveBufferSize) As Byte
 networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

 ' Output the data received from the host to the console.'
 Dim returndata As String = Encoding.ASCII.GetString(bytes)

 Dim LL As Int32 = Len(returndata)

Len() تقارير عدد البايتات وليس عدد الأحرف في السلسلة.

هل كانت مفيدة؟

المحلول

الكود الخاص بك حاليا معطل إلى حد ما. الجواب هو tcpClient.ReceiveBufferSize, ، بغض النظر عن مقدار البيانات لك في الحقيقة تلقيت - لأنك تتجاهل قيمة الإرجاع من networkStream.Read. يمكن أن تعود فقط بضع بايت ، لكنك تقوم بإنشاء سلسلة باستخدام بقية bytes صفيف على أي حال. دائماً تحقق من قيمة الإرجاع Stream.Read, ، لأنه وإلا فأنت لا تعرف مقدار البيانات التي تمت قراءة بالفعل. يجب أن تفعل شيئًا مثل:

Dim bytesRead = networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

' Output the data received from the host to the console.'
Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, bytesRead)

الآن ، لدى ASCII دائمًا حرفًا واحدًا لكل بايت (والعكس بالعكس) ، وبالتالي فإن طول السلسلة سيكون تمامًا مثل طول البيانات التي تلقيتها.

كن على علم بأن أي بيانات غير ASCII (أي أي بايت أكثر من 127) سيتم تحويلها إلى "؟" بواسطة Encoding.ASCII.GetString. يمكنك أيضًا الحصول على أحرف التحكم. هل هذه بالتأكيد بيانات نص ASCII لتبدأ؟ إذا لم يكن الأمر كذلك ، فإنني أوصي بتشفير Hex أو باستخدام بعض الخيارات الأخرى لتفريغ البيانات الدقيقة بطريقة غير راقية.

نصائح أخرى

يمكنك محاولة تقليم السلسلة داخل المكالمة إلى Len ():

Dim LL As Int32 = Len(returndata.Trim())

إذا أبلغت لين عن عدد البايتات ولا تتطابق مع عدد الشخصيات ، فيمكنني التفكير في احتمالين:

  • هناك عدد أكبر من الأدوات التي تُرسل أكثر مما تعتقد (أي أن هذه الشخصية الإضافية يتم إرسالها بالفعل)

  • الترميز ليس ASCII ، لذلك يمكن أن يكون هناك أكثر من بايت لكل Char (وواحد منهم هو أن الشخصية "الغريبة" ، وهذا هو يتم إرسال الشخصية وليس "بيانات خاطئة"). حاول معرفة ما إذا كانت البيانات مشفرة حقًا ، إن لم يكن ، قم بتغيير المكالمة وفقًا لذلك.

عندما أقرأك بشكل صحيح ، تحصل على علامة اقتباس واحدة في البداية ، أليس كذلك؟

إذا حصلت على ذلك باستمرار ، فلماذا لا تطرح واحدة فقط من طول السلسلة؟ أو استخدم فرقة فرعية من الحرف الثاني:

Len(returndata.Substring(1)

وأنا لا أفهم تمامًا ما تعنيه مع »طول السلسلة كما كنت أستخدمها عادة وليس من الصفيف الكامن وراء السلسلة نفسها«. لديك سلسلة. أي صفيف قد يمثل هذه السلسلة داخليًا يعتمد تمامًا على التنفيذ ولا يجب أن تراها أو تعتمد عليها. أو أنا أخطئك هنا. السلسلة هو ما تستخدمه بشكل طبيعي. أعني ، إذا لم يكن هذا ما تفعله ، فلماذا لا تأخذ طول السلسلة بعد، بعدما معالجته في شيء تستخدمه عادة؟

ربما أفتقد شيئًا هنا ، لكن ما الخطأ في ذلك String.Length?

Dim LL As Int32 = returndata.Length
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top