网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换。c#类库IPAddress已经封装了大小端的转换。

封装代码如下:

  1. using System.IO;
  2. using System.Net;
  3. using System;
  4. namespace Framework
  5. {
  6. public class NetStream
  7. {
  8. private MemoryStream stream;
  9. private BinaryReader reader;
  10. private BinaryWriter writer;
  11. public NetStream(byte[] buffer = null)
  12. {
  13. if (buffer == null)
  14. {
  15. this.stream = new MemoryStream();
  16. }
  17. else
  18. {
  19. this.stream = new MemoryStream(buffer);
  20. }
  21. this.reader = new BinaryReader(this.stream);
  22. this.writer = new BinaryWriter(this.stream);
  23. }
  24. public void Close()
  25. {
  26. this.stream.Close();
  27. this.reader.Close();
  28. this.writer.Close();
  29. }
  30. public long ReadInt64()
  31. {
  32. return IPAddress.HostToNetworkOrder(this.reader.ReadInt64());
  33. }
  34. public int ReadInt32()
  35. {
  36. return IPAddress.HostToNetworkOrder(this.reader.ReadInt32());
  37. }
  38. public int ReadInt16()
  39. {
  40. return IPAddress.HostToNetworkOrder(this.reader.ReadInt16());
  41. }
  42. public byte ReadByte()
  43. {
  44. return this.reader.ReadByte();
  45. }
  46. public string ReadString8()
  47. {
  48. return System.Text.Encoding.UTF8.GetString
  49. (
  50. this.reader.ReadBytes(ReadByte())
  51. );
  52. }
  53. public string ReadString16()
  54. {
  55. return System.Text.Encoding.UTF8.GetString
  56. (
  57. this.reader.ReadBytes(ReadInt16())
  58. );
  59. }
  60. public long Seek(long offset)
  61. {
  62. return this.stream.Seek(offset, SeekOrigin.Begin);
  63. }
  64. // -------------------------------------------------------------------------------
  65. public void WriteByte(byte value)
  66. {
  67. this.writer.Write(value);
  68. }
  69. public void WriteInt16(short value)
  70. {
  71. this.writer.Write
  72. (
  73. BitConverter.GetBytes
  74. (
  75. IPAddress.HostToNetworkOrder(value)
  76. )
  77. );
  78. }
  79. public void WriteInt32(int value)
  80. {
  81. this.writer.Write
  82. (
  83. BitConverter.GetBytes
  84. (
  85. IPAddress.HostToNetworkOrder(value)
  86. )
  87. );
  88. }
  89. public void WriteInt64(long value)
  90. {
  91. this.writer.Write
  92. (
  93. BitConverter.GetBytes
  94. (
  95. IPAddress.HostToNetworkOrder(value)
  96. )
  97. );
  98. }
  99. public void WriteString8(string value)
  100. {
  101. WriteByte
  102. (
  103. (byte) value.Length
  104. );
  105. this.writer.Write
  106. (
  107. System.Text.Encoding.UTF8.GetBytes(value)
  108. );
  109. }
  110. public void WriteString16(string value)
  111. {
  112. WriteInt16
  113. (
  114. (short) value.Length
  115. );
  116. this.writer.Write
  117. (
  118. System.Text.Encoding.UTF8.GetBytes(value)
  119. );
  120. }
  121. public byte[] GetBuffer()
  122. {
  123. return this.stream.ToArray();
  124. }
  125. public int GetLength()
  126. {
  127. return (int) this.stream.Length;
  128. }
  129. }
  130. }

C# Socket流数据大小端读写封装的更多相关文章

  1. C++/java之间的Socket通信大小端注意事项

    在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...

  2. 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据

    [源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...

  3. 【X86】---X86处理器大小端的数据存储验证

    之前也关注过大小端的存储,可能时间久了,加之又之前的电脑抽象换成了当前的处理器寄存器的值判断,导致自己总是有点蒙圈.看Spec手册的时候,有时会无法与手册中某个Bit的值与RU/RW工具读出来的对应上 ...

  4. C语言随笔3:指针定义、数据在地址中的大小端排列

    指针变量:用于存放另一个变量的地址 (指针变量所占空间大小由操作系统决定32/64位  4/8字节 // 声明且定义:int  *p=&a: 声明.定义:int  *p: p= &a: ...

  5. readLine读取socket流的时候产生了阻塞

    BufferedReader的readLine方法,只要读到流结束或者流关闭,就会返回null 在读取文件的时候,文件结尾就是流的结尾,但对于Socket而言不是的.不能认为流中数据读完了就是流的结尾 ...

  6. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...

  7. [转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?     http://www.52im.net/thread-1732-1-1.html   1.引言 本文接上篇<脑残式网 ...

  8. Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...

  9. C语言 - 大小端问题

    目前使用的机器都是使用字节BYTE来存储的. 对于跨越多字节的对象,必须搞清楚两个规则: 这个对象的地址是什么 在存储器中如何按照这些字节的存放的书序 对于一个整型对象 a=0x12345678,一共 ...

随机推荐

  1. c# 删除空文件夹

    https://www.cnblogs.com/vikimono/p/11066778.html

  2. java最大余数法(百分比算法Echarts)

    最近工作中使用Echarts开发报表的时候遇到了这样的一个问题,需求是一个div中左边是一个环形图表,右边是一个表格,表格中展示图表中每个类别占用的百分比.存在的问题:1.当存在四舍五入的时候,Ech ...

  3. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. DevOps理论+实践之路

    DevOps理论+实践之路  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以关注 ...

  5. [转]绑定到异步的ObservableCollection

    在进行WPF开发过程中,需要从一个新的线程中操作ObservableCollection,结果程序抛出一个NotSupportedException的错误: This type of Collecti ...

  6. 关于Canvas的坐标系

    注意Canvas的坐标系应该是这样子的: 看下面的例子: 最后的显示效果是:

  7. Django项目:CMDB(服务器硬件资产自动采集系统)--07--06CMDB测试Linux系统采集硬件数据的命令02

    #settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...

  8. centos 安装系列

    装coreseek https://www.jb51.net/os/RedHat/462185.html 卸载mysql https://www.cnblogs.com/cyl048/p/687908 ...

  9. response - 文件下载

    ## 案例:     * 文件下载需求:         1. 页面显示超链接         2. 点击超链接后弹出下载提示框         3. 完成图片文件下载 * 分析:         1 ...

  10. Python基础---控制执行流程

    一.if语句 1.if语句 作用:让程序根据条件选择性地执行某条语句或某些语句 说明:if语句又叫条件语句,也叫分支语句 语法: if 真值表达式1: 语句块1 elif 真值表达式2: 语句块2 . ...