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,一共 ...
随机推荐
- cesium-长度测量和面积测量
网上找的大神的实现方法有点问题,实现有一些bug,作为cesium新手一个,弃之不忍,只好硬着头皮修改了,不过还好问题不大,再次mark一下,下次就可以直接用了 image.png import ...
- NtQuerySystemInformation 枚举进程
函数原型: NTSTATUS WINAPI NtQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLASS SystemInformat ...
- Android开发 Camera2开发_1_拍照功能开发
介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...
- Odoo加载机制指导流程
Odoo的启动通过openerp-server脚本完成,它是系统的入口. 然后加载配置文件openerp-server.conf 或者 openerp_serverrc: openerp-server ...
- css的其他相关样式属性
一.颜色 1.预定义的表示颜色的单词 red,black.gray,pink...... 2.16进制表示 # + 6位16进制的数字0 1 2 3 4 5 6 7 8 9 a b c d e f 如 ...
- Django项目:CRM(客户关系管理系统)--66--56PerfectCRM实现CRM客户报名缴费链接
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- 搭建nodejs代理服务器,从而解决跨域问题
先在同级处新建js文件(app.js) 使用时npm 安装 Node.js 模块语法 也就是对应的文件所在地“npm install”一下 然后安装对应需要的模块: expresspathreques ...
- jeecms 前台拦截器的研究与改造
jeecms 前台拦截器的研究与改造 2013年12月24日 15:23:35 xinfei0803 阅读数 3511 jeecms出发点是面向大众的,具有前台开发性,也就是说,即时是未登录(游客 ...
- java文件配置MySQL
MybatisConfig.java文件 import com.alibaba.druid.pool.DruidDataSource; import com.xman.common.mybatis.S ...
- Webpack下创建vue项目-非vue-cli
开始准备 初始化工程目录 shell npm init -y 安装vue npm install vue 安装 webpack npm install webpack --save-dev webpa ...