如何从字符串中删除空字符(零字符)

SSp*_*oke 3 vb.net unicode ascii character-encoding null-character

我一直试图从我的字符串中删除所有零字符

我的字符串是由这些十六进制字节组成的

00 44 00 65 00 6C 00 70 00 68 00 69

对于每个字母,前面都有一个零字节(空字节).我猜测我必须使用某种Unicode编码或宽编码才能获得没有那些零的文本.

但我无法理解,所以我认为最好的方法是使用替换,但即使失败.

Dim packet() As String = {&H0, &H44, &H0, &H65, &H0, &H6C, &H0, &H70, &H0, &H68, &H0, &H69}
Dim str As String = Encoding.ASCII.GetString(packet, 0, 12)
str = str.Replace("\0", "")  'Compiles and fails
str = str.Replace(\0, "")  'No compile
str = str.Replace('\0', "")  'No compile
Run Code Online (Sandbox Code Playgroud)

Mat*_*lko 5

如果您想要一些不依赖于Microsoft.Visualbasic命名空间的东西:

str = str.Replace(Convert.ToChar(0),"")
Run Code Online (Sandbox Code Playgroud)

唯一的选择是使用与string.replace我能想到的就是使用正则表达式替换:http://msdn.microsoft.com/en-us/library/844skk0h(v=vs.110).aspx

  • 这是错误的答案.它是一个解决症状的创可贴,而不是修复根本原因 - 使用错误的`Encoding`将字节转换为`String`.修复编码并且不再需要替换. (2认同)

Rem*_*eau 5

真正的问题不是空字节,而是首先如何将字节 Ín 解码为 a String。你用错了Encoding。您应该使用Encoding.BigEndianUnicode而不是Encoding.ASCII,那么您根本不需要手动替换空值,因为它们将由解码过程为您处理:

Dim packet() As Byte = {&H0, &H44, &H0, &H65, &H0, &H6C, &H0, &H70, &H0, &H68, &H0, &H69}
Dim str As String = Encoding.BigEndianUnicode.GetString(packet)
Run Code Online (Sandbox Code Playgroud)

  • 特别是,微软到处都使用 UTF-16 **Little Endian**(`Encoding.Unicode` 使用的)。但是一些协议/平台使用 **Big Endian** 代替,这就是为什么还提供了`Encoding.BigEndianUnicode`。 (2认同)