Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 内存映射文件vbVerticalTab和vbNullChars显示在结果中_Vb.net_Memory Mapped Files - Fatal编程技术网

Vb.net 内存映射文件vbVerticalTab和vbNullChars显示在结果中

Vb.net 内存映射文件vbVerticalTab和vbNullChars显示在结果中,vb.net,memory-mapped-files,Vb.net,Memory Mapped Files,我尝试使用内存映射文件MMF在应用程序之间存储和传输数据 我已经设法创建了一个MMF并“有点”阅读它 这是我的代码: Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load createMMF() readMMF() End Sub Sub createMMF() Dim mmf As M

我尝试使用内存映射文件MMF在应用程序之间存储和传输数据

我已经设法创建了一个MMF并“有点”阅读它

这是我的代码:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        createMMF()
        readMMF()
    End Sub

    Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 5)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As BinaryWriter = New BinaryWriter(stream)
        writer.Write("hello there")
    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim streamReader = New StreamReader(stream)
        Dim text = streamReader.ReadToEnd()

        Debug.Print(text)

    End Sub

End Class
一些问题:

1在CreateNew调用中,我指定了5作为大小,但是当我将.write调用从hello更改为hello时,没有任何区别

2当我在接收函数中读取流时,字符串在那里,但它在开始时包含一个奇怪的字符,在调试器上下文中被解码为vbVerticalTab,随后包含大量vbNullChars


我希望能够在进程之间传递10Kb的字符串,并在开始和结束时准确地获得一个没有奇数字符的字符串。

好的,多亏了我的评论,我才能够使这个工作正常。这是使用二进制编写器/读取器的代码

   Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As BinaryWriter = New BinaryWriter(stream)
        writer.Write("hello there")

    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim binaryReader = New BinaryReader(stream)
        Dim length = binaryReader.Read()  'gives 11, length of "hello there" string.
        Dim text = binaryReader.ReadChars(length)

        Debug.Print(text)

    End Sub
此外,我使用StreamReader/Writer对进行了测试。我不得不在writer中使用.flush调用,ReadToEnd方法仍然有大量空字符填充

 Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As StreamWriter = New StreamWriter(stream)
        writer.Write("hello there")
        writer.Flush()

    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim streamReader = New StreamReader(stream)
        Dim text = streamReader.ReadToEnd()
        Debug.Print(text)

    End Sub
检查结果可以看到vbNull字符


有一件事在我的测试中没有什么不同,那就是.CreateNew方法的Capacity参数。即使在两个示例中的字符串长度中都输入1,也不受影响。根据我对文档的读取,应将此字节值设置为为为任务保留足够的内存。

您正在使用BinaryWriter进行写入,例如字符串长度。然后,您将使用StreamReader来阅读它,StreamReader需要没有任何元数据的原始文本。使用写入程序和读取器的匹配对,并显式指定编码。BinaryWriter对字符串进行编码,必须使用BinaryReader将其读回。奇怪字符是编码字符串长度的字节。出现空字符是因为您读得太多。