网络数据是大端模式,而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. PAT甲级——A1080 Graduate Admission

    It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applicati ...

  2. <每日一题>题目16:简单的python练习题(1-10)

    #1.python程序中__name__的作用是什么? __name__这个系统变量用来表示程序的运行方式. 如果程序在当前膜快运行,__name__的名称就是__main__, 如果不在(被调用), ...

  3. 详解 equals() 方法和 hashCode() 方法

    创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...

  4. sscanf linux-c从一个字符串中读进与指定格式相符的数据

    https://www.cnblogs.com/lanjianhappy/p/6861728.html 函数原型: Int sscanf( string str, string fmt, mixed ...

  5. Java基础——List集合整理(脑图,源码,面试题)

    常在知乎牛客网关注Java的一些面试,了解过校招社招常面哪些内容.Java集合不仅使用频率高而且在初面中也常常被问到,何止是常常,关于ArrayList的扩容,HashMap的一些底层等等都被问到烂了 ...

  6. 微信小程序slider应用,可加减的slider控制

    <view class="control-w "> <block wx:for="{{controls}}" wx:key="id& ...

  7. mysql函数,语法

    转自:http://www.cnblogs.com/kissdodog/p/4168721.html MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: ...

  8. light oj 1105 规律

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  9. 记一次server 2008 R2的按装过程

    项目上一直在用的dell务器在去年年底突然出现系统过期,导致c盘的东西全部丢失.我们用激活工具激活,还是没能找回丢失的东西. 为了装这个系统,跟同事一起折腾了好些次,最后发现安装服务器的时候有个磁盘阵 ...

  10. linux上源码安装python

    Linux安装Python2.7 以下例子基于python 2.7.9,其他版本同理.# 1.下载python# wget https://www.python.org/ftp/python/2.7. ...