C#BinaryWriter长度前缀 – UTF7编码
我有一个项目使用内存映射文件让两个应用程序相互共享数据。 生产者应用程序是用C#编写的,消费者应用程序用简单的旧C语言编写。两者都使用VS2010。
MSDN称“BinaryWriter.Write Method(String)”在数据前面加上UTF-7编码的无符号整数,然后写入有效负载。 这正是我被困住的地方。 如果我写了一个长度为256个字符的字符串,那么C app的调试器会向我显示这个字节序列:0x80 0x2 。 将长度前缀转换为我可以在消费者应用中安全使用的最佳方法是什么?
制片人应用:
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); } } } }
消费者应用:
#include #include #include #include #pragma comment(lib, "user32.lib") #define BUF_SIZE 4096 TCHAR szName[]=TEXT("Global\mappedview"); int _tmain() { HANDLE hMapFile; LPCSTR pBuf; hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, // read/write access FALSE, // do not inherit the name szName); // name of mapping object if (hMapFile == NULL) { _tprintf(TEXT("Could not open file mapping object (%d).n"), GetLastError()); return 1; } pBuf = (LPCSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); if (pBuf == NULL) { _tprintf(TEXT("Could not map view of file (%d).n"), GetLastError()); CloseHandle(hMapFile); return 1; } printf("Proc1: %snn", pBuf); // print mapped data UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0; }
克里斯
尽管微软的文档说,
- 写入的前缀号实际上是LEB128编码计数 。
- 这是字节数, 而不是字符数。
我链接的Wiki页面为您提供解码代码,但我会考虑使用自己的方案。 您可以使用Encoding.GetBytes()
手动将字符串转换为UTF8,并将其写入MMF,并在其前面加上普通的unsigned short。 这样你就可以完全控制一切。
虽然BinaryWriter.Write上的MSDN文档声明它“首先将字符串的长度写为UTF-7编码的无符号整数”,但这是错误的。 首先,UTF-7是一个字符串编码 ,你不能使用UTF-7编码整数 。 文档的含义 (和代码的作用 )是它使用可变长度的7位编码写入长度,有时称为LEB128 。 在您的特定情况下,数据字节80 02
表示以下内容:
1000 0000 0000 0010
Nbbb bbbb Eaaa aaaa
00000100000000
aaaaaaabbbbbbb
即二进制100000000
,十进制256。
上述就是C#学习教程:C#BinaryWriter长度前缀 – UTF7编码分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991102.html