首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将long编码为VLQ字节数组并将其写入System.IO.BinaryWriter

是一种数据编码和写入操作,用于将long类型的数据转换为VLQ(Variable Length Quantity)字节数组,并通过System.IO.BinaryWriter将其写入到某个数据流中。

VLQ是一种可变长度的编码方式,用于将整数表示为字节数组。它的优势在于可以有效地压缩较大的整数,并且可以灵活地扩展到不同的数据类型。

编码过程如下:

  1. 将long类型的数据转换为无符号整数(unsigned long)。
  2. 将无符号整数按照7位一组进行分组,每组的最高位用于表示是否还有后续字节。
  3. 将每组的7位数据转换为字节,并按照从低位到高位的顺序写入到字节数组中。

以下是一个示例代码,演示了如何将long编码为VLQ字节数组并写入System.IO.BinaryWriter:

代码语言:csharp
复制
using System.IO;

public static byte[] EncodeLongToVLQ(long value)
{
    ulong unsignedValue = (ulong)value;
    MemoryStream stream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(stream);

    while (unsignedValue >= 0x80)
    {
        writer.Write((byte)(unsignedValue | 0x80));
        unsignedValue >>= 7;
    }

    writer.Write((byte)unsignedValue);
    writer.Flush();

    return stream.ToArray();
}

在上述代码中,我们首先将long类型的数据转换为无符号整数unsignedValue。然后,我们创建一个内存流MemoryStream,并通过BinaryWriter将数据写入到该流中。

在while循环中,我们将unsignedValue按照7位一组进行分组,并将每组的数据写入到字节数组中。最后,我们将字节数组返回作为结果。

这种编码方式可以应用于各种场景,例如在网络通信中传输大整数数据、在数据库中存储长整型数据等。

腾讯云提供了一系列与云计算相关的产品,其中包括存储、数据库、人工智能等。根据具体需求,可以选择适合的产品进行使用。以下是一些相关产品和其介绍链接地址:

  1. 对象存储(COS):腾讯云对象存储(COS)是一种高可用、高可靠、安全、低成本的云存储服务,适用于存储和处理各种非结构化数据。详情请参考:https://cloud.tencent.com/product/cos
  2. 云数据库 MySQL 版(CMQ):腾讯云数据库 MySQL 版(CMQ)是一种高性能、可扩展、高可用的关系型数据库服务,适用于各种在线应用场景。详情请参考:https://cloud.tencent.com/product/cdb
  3. 人工智能平台(AI Lab):腾讯云人工智能平台(AI Lab)提供了一系列人工智能相关的服务和工具,包括图像识别、语音识别、自然语言处理等。详情请参考:https://cloud.tencent.com/product/ai

以上是一些腾讯云的产品示例,根据具体需求可以选择适合的产品进行使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

变长浮点编码原理

字节流中index处读取一个自然数 从第index字节开始解析一个vlq字节串(到最高位是0的字节为止),将其转成自然数 函数名:vlq2nature 输入:字节流bytes,下标index 输出:自然数...次,或遍历string的每个字符 每次提取出字符的Unicode编号(是一个自然数) 调用nature2vlq函数编号转换成字节所有字节流拼接成大字节输出 zipack类型树 zipack类型树...前缀:正小数1111,0010,负小数1111,0011 长度:无 负载:精度反转(整数部分,小数部分) 精度反转算法 以一个二进制正小数110.0101例,将其编码一段字节流,负小数同理 小数分为整数部分和小数部分...,分为110、0.0101 整数部分编码VLQ自然数(A) 小数部分末端无意义的0去掉 小数部分截取小数点后的内容得到一个字符串“0101” 字符串反转得到“1010” 通过类型转换转成自然数1010...减一得1001 将该自然数存储VLQ自然数(B) 输出A、B 字符串编码 zipack字符串的长度段代表字符的数量。

1K10

谈谈Zipack格式的设计初衷

兼容性是万恶之源,utf8从信息论的角度严重浪费空间,Zipack的字符编码采用Unicode-on-VLQ编码方案,与utf8彻底解耦,每个字符的Unicode序号(自然数)存储VLQ整数,彼此拼接在一起便成了...字符串:字符串类型(字符流)中,VLQ自然数暗示字符的数量。 列表:列表类型(数组)中,VLQ自然数暗示列表中元素的数量。 字典:存储键值对的字典类型中,VLQ自然数暗示键值对的数量。...字节流文本型格式无法轻易存储的类型。 列表(数组) 列表是一种嵌套类型,其格式就是若干个元素顺序无缝拼接。Zipack流也是这么拼接的。...经过综合的考虑,Zipack准备采用小数点分隔式编码,即将小数表示整数部分和小数部分的自然值。 单字节的true、false、null 这三个比较简单,都是单字节的常量。...2的补码:最流行的整数编码,通过负数“平移”至正数之上来进行编码,易于计算。 zigzag:从0开始,正负数交替编码,特点是,绝对值小的整数它的编码越“短”。

84510
  • HOK日志组件BqLog为什么这么快之1——实时压缩日志解析

    其他情况,VLQ编码的第一个字节的第一位都是0,所以我们就可以用它来存放表示类型的Bit位,然后从第一个字节第二位开始做实际的VLQ编码。...在读取解码的时候,按照以下流程(伪码):If(首字节后7位0){ 代表VLQ编码之后只有一个字节,值在[0, 2^7^)范围,存储在第二个字节,直接VLQ解码第二字节得到数据项(Data Item...else{ 数据类型 type = 首字节第一个比特。 字节第一个比特置0 从首字节开始解VLQ编码得到数据项(Data Item)长度。}...对比常规的思路,第一个字节放类型,从第二个字节开始做VLQ编码。本发明当数据长度大于等于2^7^的时候,可以节省一个字节。...其中前两者都是数字,用VLQ编码节约空间。

    15420

    前端面试官: 你知道source-map的原理是什么吗?

    那么映射关系为: 0 1 0 5 2 最后 01052 表示 Base64 VLQ 即可。...这种编码需要用最高位表示连续性,如果是1,代表这组字节后面的一组字节也属于同一个数;如果是0,表示该数值到这就结束了。 这样干巴巴说不太容易懂,还是举个栗子说明一下吧。...所以,137的VLQ编码形式10000001 00001001 Base64 VLQ 与一般的VLQ的区别: 一个Base64字符只能表示 6bit(2^6)的数据 Base64 VLQ需要能够表示负数...表示正负的方式: 如果这组数是某个数值的VLQ编码的第一组字节,那它的最后一位代表"符号",0正,1负; 如果不是,这个位没有特殊含义,被算作数值的一部分。 我们再来举个栗子说明下使用方法。...如何对数值137进行Base64 VLQ编码: 步骤 结果 137改写成二进制形式 10001001 127是正数,末位补0 100010010 五位一组做分组,不足的补0 01000 10010 组倒序排序

    6.3K40

    Webpack 实战系列一:正确使用 Sourcemap

    一、什么是 Sourcemap Sourcemap 协议最初由 Google 设计率先在 Closure Inspector 实现,它能够经过压缩、混淆、合并的代码还原回未打包状态,帮助开发者在生产环境中精确定位问题发生的行列位置...mappings 记录的数值关系,产物代码映射回 sourcesContent 数组所记录的原始代码文件、行、列位置,这里面最复杂难懂的点就在于 mappings 字段的规则。...1.2 源码映射与 VLQ Sourcemap 最初版本生成的 .map 文件非常大,体积大概编译产物的 10 倍;V2 引入 base64 编码等算法将之减少 20% ~ 30%;而最新版本 V3...1.2.2 VLQ 编码 参考:https://en.wikipedia.org/wiki/Variable-lengsth_quantity VLQ 本质上是一种整数数值转换为 Base64 的编码算法...VLQ 使用六位比特存储一个编码分组,例如: 数字 7 经过 VLQ 编码后,结果 001110,其中: 第一位连续标志位,标识后续分组是否同一数字; 第六位表示该数字的正负符号,0正整数,1

    3.2K10

    何为SourceMap?从编译聊聊其原理

    在前端工程体系中,一份代码从开发到上线,大多需要经过打包编译的步骤,的是: jsx, tsx, ts 之类的文件类型转译成 runtime 可以识别的 js js 转译成适用范围更广的 es5...多个 js 文件压缩成一个最终的产物,对代码进行一定程度的混淆 经过以上三个步骤,我们的代码已经变得面目全非。...分为两组,第一组是最后面的四位,既 10111,第二组是剩下的 10111,那么它最终会被编码:101110 000001。...000000 I A A M A 之所以要用 6 个字节比特为一组记录一个数字,正是因为每一个 base64 编码最多可以表示二进制 6 位,所以通过这样的编码...inline (如 inline-source-map) 该模式不会生成一份独立的.map 文件,而是用 base64 编码 sourcemap 进行编码后附在编译后代码的末处。

    1.5K10

    java常用的io流_io流java

    常用方法: // 从输入流中读取数据的下一个字节 abstract int read() // 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中 int read(byte[] b...) // 输入流中最多 len 个数据字节读入 byte 数组 int read(byte[] b, int off, int len) // 跳过和丢弃此输入流中数据的 n个字节 long...skip(long n) // 关闭此输入流释放与该流关联的所有系统资源 void close() 2).OutputStream OutputStream:字节输出流基类,抽象类是表示输出字节流的所有类的超类...常用方法: // b.length 个字节从指定的 byte 数组写入此输出流 void write(byte[] b) // 指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流...void write(byte[] b, int off, int len) // 指定的字节写入此输出流 abstract void write(int b) // 关闭此输出流释放与此流有关的所有系统资源

    1.6K20

    Source Map知多少?Golang手写SourceMap转换过程

    进行生产代码和源代码的映射,抱着知其所以然的目的,笔者对 Source Map 的前世今生进行了了解,一步步理解了 Source Map 的转换原理 二、Source Map 简介 随着 JavaScript...编码表示,代表该位置对应的转换前的源码位 按照如上规则,以下字符串里没有出现分号(,是因为转换后的源码只有一行,而逗号(,) 则将转换后源码分割 n 个位置 AAOEA,SAASC,KAAKC,...E 代表这个位置属于转换前代码的第 E 列,第五个 A 代表在 names 数组中的 index 这五个字符实际都代表着一个数字,字符映射数字需要再经过一层 Base64 VLQ 编码的转换(编码原理可以参考这篇介绍...编码的转换 第一步,Base64 VLQ 编码规则这篇文章有详细的解释,总结下来从 0-63 的数字分别可以用一个字符编码 初始化时可以字符与数字的对应关系存入一个 map,实现方法如下 //...编码, 转换为数字 continuation = digit & VLQ_CONTINUATION_BIT digit &= VLQ_BASE_MASK resultValue

    71830

    Java IO详解那点事

    常用方法: // 从输入流中读取数据的下一个字节 abstract int read() // 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中 int read(byte[]...long skip(long n) // 关闭此输入流释放与该流关联的所有系统资源 void close() 2....常用方法: // b.length 个字节从指定的 byte 数组写入此输出流 void write(byte[] b) // 指定 byte 数组中从偏移量 off 开始的...BufferedOutputStream(OutputStream out, int size) 常用方法: // 指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流...BufferedWriter BufferedWriter:字符缓冲流,文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入

    55020

    前端构建:Source Maps详解

    生成器       下面介绍Lessc、GC(Google Closure Compiler)、UglifyJS、ClojureScript和CoffeeScript Less的生成器lessc,...(若不想安装JRE那么可参考@赵劼通过IKVM.NET来clojure-compiler.jar转码.Net版)然后通过下面的命令生成.map文件: $ java -jar compiler.jar...注意:每组VLQ编码字段有0~N个VLQ编码字符组成,如qCAAUH。  4.3. VLQ编码       VLQ编码最早用于MIDI文件,后来被多种格式采用。...VLQ编码是变长的。如果(整)数值在-15到+15之间(含两个端点),用一个字符表示;超出这个范围,就需要用多个字符表示。并且规定每6bit标识一个字符。  ...最后一位(Sign位),当该节当前编码段的第一节时,表示符号1负号,0正号;若不是第一节则表示数值位。         下面对16进行VLQ编码,            1.

    1.6K80

    rpc框架之 thrift 学习 2 - 基本概念

    Variable-Length Quantity VLQ 变长编码: Thirft采用TCompactProtocol序列化时之所以高效,跟VLQ变长编码有很大关系,直接借下面这张图来说吧: 整数106903...,在java中我们知道int占用4个bytes,也就是32bit,高位字节如果不满,用0填充(最高位符号位除外), 这样的话,很多用0填充的高位字节位置其实是浪费的,VLQ的基本思路是2进制每7位分组...,这样106903的2进制就可以分成3组,然后每1组的最高位设为1或0,如果1,表示相邻的下一个字节还有内容,要继续读取,如果该位置0,则表示结束了。...这样的话,106903最终只需要3个字节就可以存储了,节省了1个字节。 上述这一堆概念在运行时,是如何串起来的呢?...:5 BinaryProtocol序列后的byte数组长度:11 JsonProtocol序列后的byte数组长度:29 {"1":{"i16":1},"2":{"i16":5}} ----------

    1K70

    【Java】IO 操作详解

    flush()方法用来当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新。 close()方法用来关闭1/0流释放与当前1/0流相关的系统资源。...在复制文件时,可以一次性读取多个字节的数据,保存在字节数组中,然后字节数组中的数据一次性写入文件。...,返回数组长度 int read(char[] cbuf, int off, int len) 数据读入 char 类型的数组的指定区间,返回数组长度 void close() 关闭数据流 long...InputStreamReader:是从字节流到字符流的桥梁,父类是 Reader 它读取字节使用指定的编码将其解码字符 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集...OutputStreamReader:是从字符流到字节流的桥梁,父类是 Writer 是从字符流到字节流的桥梁,使用指定的编码写入的字符编码字节 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

    10710

    【Java基础-3】吃透Java IO:字节流、字符流、缓冲流

    文本读写的例子,也就是文章开头所说的,“松下问童子,言师采药去。只在此山中,云深不知处。”写入本地文本,然后再从文件读取内容输出到控制台。...ByteArrayInputStream:字节数组输入流,从字节数组(byte[])中进行以字节单位的读取,也就是资源文件都以字节的形式存入到该类中的字节数组中去。...的实例对象),它读取字节使用指定的字符集将其解码字符。...write(int b) :指定字节写入此文件输出流。 close() :关闭此输入流释放与该流关联的所有系统资源。...UTF-8 编码中,一个英文字一个字节,一个中文三个字节。 Unicode 编码中,一个英文一个字节,一个中文两个字节。 符号:英文标点一个字节,中文标点两个字节。例如:英文句号 .

    50430

    avro格式详解

    用户提供该模式的说明(可选) aliases:字符串的json数组该记录提供备用名称 fields:一个json数组,罗列所有字段(必选),每个字段又都是一个json对象,包含如下属性: name...类型:以1字节的0或1来表示false或true; 对于int、long:以zigzag的方式编码写入 对于float:固定4字节长度,先通过floatToIntBits转换为32位整数,然后按小端编码写入...对于double:固定8字节长度,先通过doubleToLongBits转换为64位整型,然后按小端编码写入。...对于maps:被编码一系列的块。每个块由一个长整数的计数表示键值对的个数(采用zigzag编码写入),其后是多个键值对,计数0的块表示map的结束。每个元素按照各自的schema类型进行编码。...对于arrays:与map类似,同样被编码一系列的块,每个块包含一个长整数的计数,计数后跟具体的数组项内容,最后以0计数的块表示结束。数组项中的每个元素按照各自的schema类型进行编码

    2.8K11

    JavaScript Source Map 详解

    如果与转换前的文件在同一目录,该项空。   - sources:转换前的文件。该项是一个数组,表示可能存在多个文件合并。   - names:转换前的所有变量名和属性名。   ...再次,每一位都采用VLQ编码表示;由于VLQ编码是变长的,所以每一位可以由多个字符构成。 如果某个位置是AAAAA,由于A在VLQ编码中表示0,因此这个位置的五个位实际上都是0。...八、VLQ编码 最后,谈谈如何用VLQ编码表示数值。 这种编码最早用于MIDI文件,后来被多种格式采用。它的特点就是可以非常精简地表示很大的数值。 VLQ编码是变长的。...九、VLQ编码:实例 下面看一个例子,如何对数值16进行VLQ编码。   第一步,16改写成二进制形式10000。   第二步,在最右边补充符号位。...第六步,每一段转成Base 64编码。 查表可知,100000g,000001B。因此,数值16的VLQ编码gB。

    1.3K50

    第二十二天 IO-高效流(缓冲流)&转换流【悟空教程】

    1.5.2.1 字符高效输出流 BufferedWriter (换行) 文本写入字符输出流,高效各个字符,从而提供单个字符、数组和字符串的高效写入。...它的作用的就是,字符串按照指定的编码表转成字节,在使用字节这些字节写出去。 ?...2.4 InputStreamReader类 查阅InputStreamReader的API介绍,InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节将其解码字符...循环一次读取一个字符,打印。 关闭输出转换流。 运行程序,打印内容。 3) Test2中读取的编码改为:GBK,再次运行Test2,会看到乱码,请问为什么?...文本中的所有字符以字符数组形式读出,字符数组存储到字符串缓存区中, 字符串缓冲区中的字符串一次性写出到文件 abc22.txt,同样也是UTF-8编码 答案: public static void

    1.2K30
    领券