C# Socket流数据大小端读写封装
网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换。c#类库IPAddress已经封装了大小端的转换。
封装代码如下:
- using System.IO;
- using System.Net;
- using System;
- namespace Framework
- {
- public class NetStream
- {
- private MemoryStream stream;
- private BinaryReader reader;
- private BinaryWriter writer;
- public NetStream(byte[] buffer = null)
- {
- if (buffer == null)
- {
- this.stream = new MemoryStream();
- }
- else
- {
- this.stream = new MemoryStream(buffer);
- }
- this.reader = new BinaryReader(this.stream);
- this.writer = new BinaryWriter(this.stream);
- }
- public void Close()
- {
- this.stream.Close();
- this.reader.Close();
- this.writer.Close();
- }
- public long ReadInt64()
- {
- return IPAddress.HostToNetworkOrder(this.reader.ReadInt64());
- }
- public int ReadInt32()
- {
- return IPAddress.HostToNetworkOrder(this.reader.ReadInt32());
- }
- public int ReadInt16()
- {
- return IPAddress.HostToNetworkOrder(this.reader.ReadInt16());
- }
- public byte ReadByte()
- {
- return this.reader.ReadByte();
- }
- public string ReadString8()
- {
- return System.Text.Encoding.UTF8.GetString
- (
- this.reader.ReadBytes(ReadByte())
- );
- }
- public string ReadString16()
- {
- return System.Text.Encoding.UTF8.GetString
- (
- this.reader.ReadBytes(ReadInt16())
- );
- }
- public long Seek(long offset)
- {
- return this.stream.Seek(offset, SeekOrigin.Begin);
- }
- // -------------------------------------------------------------------------------
- public void WriteByte(byte value)
- {
- this.writer.Write(value);
- }
- public void WriteInt16(short value)
- {
- this.writer.Write
- (
- BitConverter.GetBytes
- (
- IPAddress.HostToNetworkOrder(value)
- )
- );
- }
- public void WriteInt32(int value)
- {
- this.writer.Write
- (
- BitConverter.GetBytes
- (
- IPAddress.HostToNetworkOrder(value)
- )
- );
- }
- public void WriteInt64(long value)
- {
- this.writer.Write
- (
- BitConverter.GetBytes
- (
- IPAddress.HostToNetworkOrder(value)
- )
- );
- }
- public void WriteString8(string value)
- {
- WriteByte
- (
- (byte) value.Length
- );
- this.writer.Write
- (
- System.Text.Encoding.UTF8.GetBytes(value)
- );
- }
- public void WriteString16(string value)
- {
- WriteInt16
- (
- (short) value.Length
- );
- this.writer.Write
- (
- System.Text.Encoding.UTF8.GetBytes(value)
- );
- }
- public byte[] GetBuffer()
- {
- return this.stream.ToArray();
- }
- public int GetLength()
- {
- return (int) this.stream.Length;
- }
- }
- }
C# Socket流数据大小端读写封装的更多相关文章
- C++/java之间的Socket通信大小端注意事项
在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
[源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...
- 【X86】---X86处理器大小端的数据存储验证
之前也关注过大小端的存储,可能时间久了,加之又之前的电脑抽象换成了当前的处理器寄存器的值判断,导致自己总是有点蒙圈.看Spec手册的时候,有时会无法与手册中某个Bit的值与RU/RW工具读出来的对应上 ...
- C语言随笔3:指针定义、数据在地址中的大小端排列
指针变量:用于存放另一个变量的地址 (指针变量所占空间大小由操作系统决定32/64位 4/8字节 // 声明且定义:int *p=&a: 声明.定义:int *p: p= &a: ...
- readLine读取socket流的时候产生了阻塞
BufferedReader的readLine方法,只要读到流结束或者流关闭,就会返回null 在读取文件的时候,文件结尾就是流的结尾,但对于Socket而言不是的.不能认为流中数据读完了就是流的结尾 ...
- 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...
- [转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网 ...
- Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...
- C语言 - 大小端问题
目前使用的机器都是使用字节BYTE来存储的. 对于跨越多字节的对象,必须搞清楚两个规则: 这个对象的地址是什么 在存储器中如何按照这些字节的存放的书序 对于一个整型对象 a=0x12345678,一共 ...
随机推荐
- PAT甲级——A1094 The Largest Generation
A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level bel ...
- hdfs写并发问题
hdfs文件写入不支持多个进程同时写入一个文件,每次只能一个FS挟持对象的人写入
- PLSQL远程访问Oracle数据库配置
PLSQL远程访问Oracle数据库的配置 监听器(LISTENER) :监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那 ...
- Leetcode946. Validate Stack Sequences验证栈序列
给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true:否则,返回 false . 示例 1: 输入:pus ...
- windows修改或删除已保存samba输入的用户名和密码
可在系统的"控制面板\用户帐户\凭据管理器\windows 凭据"中找到 可以在"开始菜单->运行",输入"control userpasswo ...
- css3的2D变形
一.2D变形 1.变形 transform:translate();translateX();translateY();translate(,); 2.过渡 transition:all 1s; 二. ...
- linux 三剑客命令(grep,sed ,awk)
grep 命令 :强大的文本’搜索’工具 1.grep -n 'word' file_name 在file_name文件中找到word所在的所有行并显示.-n 为显示行号. 2 ...
- HYSBZ 1015/BZOJ1015 星球大战starwar
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- SQL _join on 和where的执行顺序
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...
- 使用Python的requests库作接口测试——请求对象与响应对象
任何时候调用requests.*()操作接口时,我们都在做两件事情: 1.构建一个Request对象,该对象被发送到服务器去请求或查询一些资源: 2.一旦requests得到一个从服务器返回的响应,就 ...