vb.net - 在 vb.net 中嵌入空值的字符串长度

标签 vb.net vb6 string-length

我有一个简单的问题:vb.net 如何确定字符串长度并处理字符串的终止?
我知道在 C(及其系列)中,空字符是字符串的结尾。在 vb6 中空字符对字符串的终止没有影响,但在 vb.net 中它似乎是模糊的!
假设这段代码在 vb6 中:

Private Sub Command1_Click()
Dim Str As String
Str = "Death is a good user," & Chr(0) & " Yes I'm good"
RichTextBox1.Text = Str
RichTextBox1.Text = RichTextBox1.Text & vbNewLine & Len(Str)
End Sub
当这段代码运行时会发生什么:

没关系。这是 C 中的类似代码:
#include "stdafx.h"
#include <string.h> 
int main(int argc, char* argv[])
{
    char *p="Death is a good user,\0 Yes I'm good";

    printf("String:%s\nString length:%d\n",p,strlen(p));

    return 0;
}
这就是发生的事情:

根据 C 规则,这也很好,但这里是 vb.net 中的相同代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim str As String = "Death is a good user," & Chr(0) & " Yes I'm good"
    RichTextBox1.Text = str
    RichTextBox1.Text &= vbNewLine & str.Length
End Sub
会发生什么:

这似乎不太对!
编辑 1 :写入文件似乎是正确的:

编辑 2 :Marktcarvin 建议,这可能是 UI 的问题,但它没有解释为什么 vb6 显示整个字符串!
编辑 3 :我知道 Windows 及其 API、UI、... 是用 C 编写的,所以它们像 C 一样使用react是正常的,但正如我上面所展示的,它们没有。

最佳答案

底层运行时支持库在您的代码段中使用了 3 种不同的字符串类型:

  • BSTR,由 VB6 使用。它是所有 ActiveX 控件使用的 COM 自动化类型,可以存储 Unicode 字符串并包括显式长度。因此,BSTR 可以存储嵌入的零。
  • C 字符串,由 C 语言使用。不存储显式长度,零表示字符串结束。 winapi 基于 C,并在其函数中使用 C 字符串。
  • System.String,.NET 字符串类型,用于任何 .NET 代码。与 BSTR 类似,它也有一个明确的长度字段,因此可以存储带有嵌入零的字符串。

  • 在所有三种情况下,底层运行时支持库都需要使用互操作来使字符串可见:
  • VB6 为 RichEditBox 使用 ActiveX 控件。控件的确切外观很难猜测,它非常特定于 VB6,名为richtx32.ocx。它也使用 native Windows Richedit 控件 (riched32.dll),因此 ActiveX 控件非常充当包装器,使 native Windows 控件可用于 VB6 应用程序。您已经最终证明它尊重 BSTR 的行为并处理嵌入的零,就像任何 ActiveX 控件应该做的那样。
  • C 程序使用 C 运行时库,该库又通过调用 winapi 控制台函数 WriteConsole() 来实现 printf()。这个 api 函数是基于 C 的,但降压已经在 printf() 处停止,嵌入的零是该函数的字符串终止符。这里没有惊喜。
  • Winforms 程序使用 .NET RichEditBox 类,这是 Riched20.dll native Windows 控件的托管包装器。底层机制是pinvoke,类的几乎所有属性和方法都是通过pinvoking SendMessage()来实现的,以发送像EM_SETTEXTEX这样的消息,改变控件显示的文本的消息。这也是一个基于 C 的 api,零就像一个字符串终止符。与richtx32.ocx 包装器不同,.NET RichEditBox 包装器类不使用 而不是 努力正确处理带有嵌入零的字符串。它只是按原样传递字符串并将其留给 pinvoke 编码器,以将 .NET 字符串转换为 C 字符串。除了在零处截断字符串之外别无选择,因为 C 字符串没有长度字段。
  • 关于vb.net - 在 vb.net 中嵌入空值的字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13594248/

    相关文章:

    c - 如何确定字符串长度?

    vb.net - vb.net中有没有将字符串转换为整数的函数?

    java - android tcp/ip 套接字不会将数据发送到计算机

    vb6 - 如何在 VB6 中的按钮正下方放置弹出菜单

    vb6 - 如何实现全局 VB6 错误处理程序?

    c# - WPF 字符串长度转换器

    c# - 当字符串达到特定长度时删除字符串中的字符

    javascript - AJAX 成功函数调用成功但未正确更新页面

    vb.net - [WebException : The request failed with HTTP status 404: Not Found.]

    c# - 单步执行 .NET 类包装的 VB6 COM 对象