Buffer对byte[]的处理

邻家大哥呀 2018-01-17 10:02:20
以前进行类型间的转换都是直接转,可这次要与后端对应。必须用buffer懵逼了。特来向大神们请教

Buffer如何对byte[]进行处理,使其变成string。

对buffer的了解有限,不知道这样表达正不正确 ,劳烦大家
...全文
1159 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
邻家大哥呀 2018-01-23
  • 打赏
  • 举报
回复
谢谢各位大神于百忙之中做出的回答,虽然现在对我来说还是有点深奥,但是我相信不久的将来 我还是完全可以理解的。谢谢大家了
weixin_38788381 2018-01-18
  • 打赏
  • 举报
回复
说说看 Buffer 是什么?为什么要用 Buffer?
xuzuning 2018-01-17
  • 打赏
  • 举报
回复
byte[] 是什么?byte[] 实际是无格式字符串的一种表示形式 通讯中都是直接传输 byte[] 而不是 string,因为 string 中含有字符编码信息,容易产生误解 Buffer 是按字节管理数组的类,相似于 C/C++ 的内存映射操作,并无转换成字符串的能力 比如
            int[] a = { 1, 2 };
            Console.WriteLine(Buffer.GetByte(a, 4));
输出 2 因为数组a的成员在内存中的排列是:(16进制) 01 00 00 00 02 00 00 00
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
如果对方要求你使用protobuf,如果对方是使用C#的人,让他把他的protobuf 对象发给你。你就可以按照上楼发给的地址进去对应的序列化/反序列化过程 如果对方不是使用C#的人,请让对方给出标准的 protobuf IDL文件,你自己根据IDL收到生成C#对象(这个过程可以手动代码,也可以用工具生成)
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
我们来看一篇,没具体看,不过大体认为他可以 http://blog.csdn.net/e295166319/article/details/52806791 我们看到,在采用protobuf,avro这类玩意进行通讯的时候,我们只是按照protobuf规定能识别的数据类型,定义一个对象。(当然实际上是先定义IDL文件,然后通讯双方根据IDL文件自己生成对象),然后具体的对象到字节数组,字节数组到对象都是protobuf自己内部完成的 如果是采用Grpc通讯,你连封包都可以省掉,grpc自己封,自己解。 如果你们采用自己的通讯封包,这需要定义好封包,而不是强行说protobuf序列化不足100字节,自己补0
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
貌似没有碰到过这样的需求。 之所以我们采用protocolbuf,avro这类东西进行数据通讯,原因就是因为他和语言无关,序列化和反序列化都是内部自己完成。所以并不存在对不对齐这么一说 如果你一定说有对齐,那么只能说你们的协议对外又封了一层。比如你们对外自己封了 数据包头,数据区。然后你说要对齐。我只能能认为你们甚至规定了,这个必须有100字节,不到100字节补0.这个其实也没有这样一说,如果是自己封包,正常封法是 包头标识+ 整包长度(也可以是数据长度,这个看个人喜好)+rotocolbuf序列化的数据区byte[]
邻家大哥呀 2018-01-17
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
后端对应??请详细描述。
其实是这个样子的,我这边(客户端)需要将数据发送到服务端,首先要将数据进行protobuf,protobuf我是MemoryStream.ToArray() 得到的是byte[]。而我需要用buffer对其进行处理得到string。至于原因 是服务端那边需要对我的数据进行解,所以两边必须对应
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
后端对应??请详细描述。
xuzuning 2018-01-17
  • 打赏
  • 举报
回复
说说看 Buffer 是什么?为什么要用 Buffer?
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
其实问题很明白,既然选择使用ProtoBuf规范,那就用ProtoBuf自己提供的方法做,别总想者自己在byte[] 自己提取 这就好像别人给你个json字符串,我们用json.net工具类去转换,而不是自己在字符串里用 indexof,substring玩。
xuzuning 2018-01-17
  • 打赏
  • 举报
回复
引用 10 楼 wanghui0380 的回复:
呵呵,楼上的你误会lz的Buffer
我并没有误会,其实楼主发关于 ProtoBuf 的帖子并不止这一个 所以楼主不可能不知道如何编码或如何解码,因为编解码的方法都在 ProtoBuf 类中。 真不会,也不可能得到 08 0f 12 03 61 61 61 20 01 2a 03 62 62 62 这样的编码结果 其实是楼主误以为 <Buffer 08 0f 12 03 61 61 61 20 01 2a 03 62 62 62> 的 Buffer 是 C# 的 Buffer 类,所以才会有这一贴
wanghui0380 2018-01-17
  • 打赏
  • 举报
回复
呵呵,楼上的你误会lz的Buffer lz说的Buffer并不是微软的Buffer类,他只的是protoBuffer,是google那款 他不知道一个string,怎么序列化成protoBuffer的byte[],或者说他不知道一个byte[]怎么用protoBuffer反序列成string 我前面已经告诉他了,让他不用纠结。既然双方都用protoBuffer,那么就问一下对方,他怎么接收的就好。如果说对方回答他可以直接用protoBuffer反序列化成string,让对方把代码贴出来,如果对方也不能则让对方把他们认为的那个对象贴出来 这个过程其实比较象json,这边并不是不知道怎么接收一个string,这边只是不知道这个string怎么反成一个对象。如果是那json比方,楼主说我有一个 error的字符串变量我应该怎么生成一个json字符串对方。(我们说,这种情况下是,先问对付,你TMD到底要什么json字符串,给我例子,给我个标准出来)
xuzuning 2018-01-17
  • 打赏
  • 举报
回复
Buffer. 可以读取(写入)数组内存映射,可以整块的在数组间复制 Buffer 处理过的数组还是数组,只是内容可能变了 是不是你们约定了以 <Buffer 08 0f 12 03 61 61 61 20 01 2a 03 62 62 62> 这种格式传递数据? 也就是说,你需要差生这样形式的字符串? 如果是,可以这样 byte[] b = .... 你编码得到的字节数组 string out = string.Format("<Buffer {0}>", BitConverter.ToString(b).Replace("-", " ")); out 就是你要的字符串 08 0f 12 03 61 61 61 20 01 2a 03 62 62 62 解码后是 15、 aaa、 bbb
邻家大哥呀 2018-01-17
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
byte[] 是什么?byte[] 实际是无格式字符串的一种表示形式 通讯中都是直接传输 byte[] 而不是 string,因为 string 中含有字符编码信息,容易产生误解 Buffer 是按字节管理数组的类,相似于 C/C++ 的内存映射操作,并无转换成字符串的能力 比如
            int[] a = { 1, 2 };
            Console.WriteLine(Buffer.GetByte(a, 4));
输出 2 因为数组a的成员在内存中的排列是:(16进制) 01 00 00 00 02 00 00 00
你好,请问。byte[]是无符号字符串的一种表示形式,是不是就无法用Buffer进行处理了。 Buffer.GetByte(a,4) :只能输出索引指定的那个值。有没有办法能将整个byte处理了 另外,Buffer处理过后的是不是都有个标识,例如:<Buffer 08 0f 12 03 61 61 61 20 01 2a 03 62 62 62>

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧