我有一个项目使用内存映射文件让两个应用程序相互共享数据.生产者应用程序是用C#编写的,消费者应用程序用简单的旧C语言编写.两者都使用VS2010.
MSDN称"BinaryWriter.Write Method(String)"在数据前面加上UTF-7编码的无符号整数,然后写入有效负载.这正是我被困住的地方.如果我写了一个长度为256个字符的字符串,那么C app的调试器会显示这个字节序列:0x80 0x2 <256次有效负载char>.将长度前缀转换为我可以在消费者应用中安全使用的最佳方法是什么?
制片人应用:
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Text;
using System.Linq;
class Program
{
static void Main(string[] args)
{
using (MemoryMappedFile mmf_read = MemoryMappedFile.CreateNew("mappedview", 4096))
{
using (MemoryMappedViewStream stream = mmf_read.CreateViewStream())
{
string str;
BinaryWriter writer = new BinaryWriter(stream);
str = string.Join("", Enumerable.Repeat("x", 256));
writer.Write(str);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
消费者应用:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
#define BUF_SIZE 4096
TCHAR szName[]=TEXT("Global\\mappedview");
int _tmain()
{
HANDLE hMapFile;
LPCSTR …Run Code Online (Sandbox Code Playgroud) 使用什么整数编码方案来实现以下目标,以及如何在.Net中执行此操作:
127 = 7F
128 = 8001
255 = FF01
256 = 8002
500 = F403
Run Code Online (Sandbox Code Playgroud) 我尝试使用 BinaryWriter 然后使用 BinaryReader 编写一些代码。当我想写时,我使用 Write() 方法。但问题是,在 Write 方法的两行之间出现了一个新字节,该字节在 ASCII 表中为十进制 31(sometines 24)。你可以在这张图片上看到它:

您可以看到索引 4 处的字节(第 5 个字节)的 ASCII 十进制值是 31。我没有在那里插入它。正如您所看到的,第一个 4 个字节是为数字(Int32)保留的,接下来是其他数据(主要是一些文本 - 现在这并不重要)。
正如您从我编写的代码中看到的: - 在第一行输入数字 10 - 在第二行文本“这是一些文本...”
第 5 个字节(12 月 31 日)是怎么出现在中间的?
这是我的代码:
static void Main(string[] args)
{
//
//// SEND - RECEIVE:
//
SendingData();
Console.ReadLine();
}
private static void SendingData()
{
int[] commandNumbers = { 1, 5, 10 }; //10 is for the users (when they send some text)!
for (int i …Run Code Online (Sandbox Code Playgroud)