首页 > 编程语言 >一种基于偏移流和纯字符串流来存储和读取字符串列表的方法【C#】

一种基于偏移流和纯字符串流来存储和读取字符串列表的方法【C#】

时间:2024-01-15 10:25:23浏览次数:30  
标签:流和纯 int FileStream C# fs2 offset 字符串 new

字符串的存储长度是可变的,在C#中,BinaryWriter和BinaryReader在Write,ReadStirng的时候,都在单个流中字符串的二进制数组前面加了一个二进制数组的长度信息,方便读取的时候,造成了记录字符串的流并不纯粹是字符串的内容。但是,有时候,我们可以,也可能必须记录纯粹的字符串的二进制内容,然后辅以另一个偏移流,来实现字符串列表的存储与读写(比如:https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata#binary-table-format)

针对这种情况的demo如下:
write:


var strs = new List<string> { "EBPlate", "EBBeam", "EBWall", "EBColumn" };
FileStream fs1 = new FileStream("content.bin", FileMode.Create), fs2 = new FileStream("offset.bin", FileMode.Create);
BinaryWriter bs2 = new BinaryWriter(fs2);
int offset = 0;
foreach(var  str in strs)
{
    bs2.Write(offset);
    byte[] bytes=UTF8Encoding.UTF8.GetBytes(str);
    fs1.Write(bytes, 0, bytes.Length);  
    offset += bytes.Length;
}
bs2.Write(offset);
fs1.Close();fs2.Close();
bs2.Close();

read


FileStream fs1 = new FileStream("content.bin", FileMode.Open), fs2 = new FileStream("offset.bin", FileMode.Open);
BinaryReader br1 = new BinaryReader(fs1), br2 = new BinaryReader(fs2);
long count = fs2.Length / sizeof(int);
var offsets = new List<int>();
var strs = new List<string>();
for(int i = 0; i < count; i++)
{
    int ivalue = br2.ReadInt32();
    offsets.Add(ivalue);
}
for(int i=0;i<offsets.Count-1;i++ )
{
    int start = offsets[i];
    int length = offsets[i + 1]-start;
    byte[] b=new byte[length];
    fs1.Read(b,0,length);
    var str=Encoding.UTF8.GetString(b);
    strs.Add(str);
}
foreach(var str in strs)
{
    Console.WriteLine(str);
}
fs1.close();fs2.close();br1.close();

标签:流和纯,int,FileStream,C#,fs2,offset,字符串,new
From: https://www.cnblogs.com/johnyang/p/17964807

相关文章

  • 金融行业CRM选型必看:哪款金融CRM好用?
    市场形式波诡云谲,金融行业也面临着资源体系分散、竞争力后继不足、未知风险无法规避等问题。金融企业该如何解决这些问题,或许可以了解一下Zoho CRM管理系统,和其提供的金融行业CRM解决方案。金融CRM系统可以智能化客户筛选、整合各个资源体系、提升企业核心竞争力、规避安全风险......
  • xtrabackup备份工具
    为什么要学这个工具背景一个合格的运维工程师或者dba工程师,如果有从事数据库方面的话,首先需要做的就是备份,如果没有备份,出现问题的话,你的业务就会出问题,你的工作甚至会。。。所以备份是重要的,但光有备份还不行,备份后如果出现问题,你还得使用备份数据来恢复,但恢复数据的时间一......
  • AI 图像自动补全 Uncrop 工具介绍
    ClipDropUncrop是一款基于AI的图像自动补全工具,由StabilityAI旗下的Clipdrop开发。通过利用StableDiffusionXL开发的算法和深度学习技术,Uncrop可以对用户上传的图片进行自动扩展和补全,改变图片尺寸,使得图像内容得到更完整的呈现。用户只需要上传需要补全的图片,选择想要的尺寸,Un......
  • DPO: Direct Preference Optimization 直接偏好优化(学习笔记)
    学习参考:链接1  一、为什么要提出DPO在之前,我们已经了解到基于人类反馈的强化学习RLHF分为三个阶段:全监督微调(SFT)、奖励模型(RM)、强化学习(PPO)。但是RLHF面临缺陷:RLHF是一个复杂且经常不稳定的过程,首先拟合反映人类偏好的奖励模型,然后使用强化学习微调大型无监督LM,以最大......
  • FreeSwitch: esl 调用lua动态传参&日志查看
    lua脚本在执行过程中,可动态接收参数,这样可以让系统更灵活,以上节的自动外呼为例,callout.lua改成下面这样:--主叫localcallernum=argv[1];--被叫localcalleenum=argv[2];freeswitch.consoleLog("info","debug==>caller:"..callernum..",callee:"..calleenum.......
  • Kong网关转发TCP协议和WebSocket协议的请求
    一、TCP协议1、修改配置文件,开启流端口vim/etc/kong/kong.confstream_listen=0.0.0.0:9000,0.0.0.0:90012、利用KongA配置tcp和websocket协议上游服务配置 路由配置:Destinations写kong网关的9000端口(只支持ip+port的形式)   二、WebSocket协议上游服务配置......
  • 关于echarts+vue频繁刷新的造成的内存增长问题
    前言关于解决echarts+ws多次数据刷新渲染,内存增长溢出的尝试。记录一下,便于下次使用有参考方法关闭echarts动画tooltip的动画设置为false。(echarts动画会缓存,通过快照可以看出)tooltip:{axisPointer:{animation:false,//很重要!},......
  • Windows10安装Docker
    一、安装DockerDesktopforWindows在官网下载DockerDesktopforWindows:https://docs.docker.com/desktop/install/windows-install/;双击下载的DockerforWindowsInstaller安装文件,一路Next,点击Finish完成安装。注意:保持默认选择“InstallrequiredWindowscompo......
  • LCD 硬件操作原理
    1、LCD显示原理  FrameBuffer即显存   SMT32与液晶控制芯片通过8080接口通讯,而液晶控制芯片包含显存、LCD控制器、LCD屏幕,液晶控制芯片常见有RA8875、ILI9341等芯片 嵌入式Linux则使用TFTRGB接口,内存和LCD控制器集成在Soc里面,外部接一个LCD屏幕。......
  • 使用 Python 将数据写入 Excel 工作表
    在数据处理和报告生成等工作中,Excel表格是一种常见且广泛使用的工具。然而,手动将大量数据输入到Excel表格中既费时又容易出错。为了提高效率并减少错误,使用Python编程语言来自动化数据写入Excel表格是一个明智的选择。Python作为一种简单易学且功能强大的编程语言,其丰富的......