TCP/IP接收ASCII转十六进制加括号显示异常问题求助
问题分析与解决代码
你的代码存在几个关键问题,导致输出不符合预期:
- 不可打印的ASCII控制字符(比如0x07、0x05)转成字符串时会被替换成
?,再转十六进制就会变成3F,完全丢失了原始字节的真实信息。 - 你先把转换后的乱码字符串赋值给TextBox3,随后又循环追加转换后的十六进制值,导致结果是原始乱码加错误的十六进制内容,自然出现
??75这类异常输出。 - 直接用
ReceiveBufferSize创建数组会读取大量空字节(0x00),后续处理会引入无效内容。
修正后的代码直接操作读取到的原始字节,避免转字符串丢失信息:
If TCPClientStream.DataAvailable = True Then Dim rcvbytes(TCPClientz.ReceiveBufferSize - 1) As Byte ' 记录实际读取的字节数,只处理有效数据 Dim bytesRead As Integer = TCPClientStream.Read(rcvbytes, 0, rcvbytes.Length) Dim result As New StringBuilder() For i As Integer = 0 To bytesRead - 1 ' 把每个字节转成两位十六进制,大写/小写可按需调整 Dim hexStr As String = rcvbytes(i).ToString("X2") result.Append($"[{hexStr}]") Next TextBox3.Text = result.ToString() End If
代码说明:
- 用
bytesRead记录实际读取的字节数,跳过数组中未被使用的空字节,只处理有效数据。 - 直接操作原始字节,不会丢失控制字符信息,0x07会被正确转为
07,0x05转为05。 - 使用
StringBuilder拼接字符串,比直接操作TextBox.Text效率更高,避免多次字符串拼接的性能损耗。 ToString("X2")保证每个字节转为两位十六进制格式,避免出现单字符的十六进制(比如0x07不会显示成7)。
内容的提问来源于stack exchange,提问作者Ranjan Sapkota
相关产品推荐
相关产品推荐

