@@ -7,139 +7,167 @@ namespace iotdb_client_csharp.client.utils
77 public class ByteBuffer
88 {
99 private byte [ ] buffer ;
10- private List < byte > write_buffer ;
11- private int pos ;
10+ private int write_pos = 0 , read_pos = 0 ;
1211 private int total_length ;
1312 private bool is_little_endian ;
14- public ByteBuffer ( byte [ ] buffer ) {
13+
14+ public ByteBuffer ( byte [ ] buffer ) {
1515 this . buffer = buffer ;
16- this . pos = 0 ;
16+ this . read_pos = 0 ;
17+ this . write_pos = buffer . Length ;
1718 this . total_length = buffer . Length ;
18- this . write_buffer = new List < byte > { } ;
19+ this . is_little_endian = BitConverter . IsLittleEndian ;
20+ }
21+ public ByteBuffer ( int reserve = 1 ) {
22+ this . buffer = new byte [ reserve ] ;
23+ this . write_pos = 0 ;
24+ this . read_pos = 0 ;
25+ this . total_length = reserve ;
1926 this . is_little_endian = BitConverter . IsLittleEndian ;
2027 }
2128 public bool has_remaining ( ) {
22- return pos < total_length ;
29+ return read_pos < this . write_pos ;
2330 }
2431 // these for read
2532 public byte get_byte ( ) {
26- var byte_val = buffer [ pos ] ;
27- pos += 1 ;
33+ var byte_val = buffer [ read_pos ] ;
34+ read_pos += 1 ;
2835 return byte_val ;
2936 }
3037 public bool get_bool ( ) {
31- bool bool_value = BitConverter . ToBoolean ( buffer , pos ) ;
32- pos += 1 ;
38+ bool bool_value = BitConverter . ToBoolean ( buffer , read_pos ) ;
39+ read_pos += 1 ;
3340 return bool_value ;
3441 }
3542 public int get_int ( ) {
3643
37- var int_buff = buffer [ pos ..( pos + 4 ) ] ;
44+ var int_buff = buffer [ read_pos ..( read_pos + 4 ) ] ;
3845 if ( is_little_endian ) {
3946 int_buff = int_buff . Reverse ( ) . ToArray ( ) ;
4047 }
4148 int int_value = BitConverter . ToInt32 ( int_buff ) ;
42- pos += 4 ;
49+ read_pos += 4 ;
4350 return int_value ;
4451 }
4552 public long get_long ( ) {
46- var long_buff = buffer [ pos ..( pos + 8 ) ] ;
53+ var long_buff = buffer [ read_pos ..( read_pos + 8 ) ] ;
4754 if ( is_little_endian ) {
4855 long_buff = long_buff . Reverse ( ) . ToArray ( ) ;
4956 }
5057 long long_value = BitConverter . ToInt64 ( long_buff ) ;
51- pos += 8 ;
58+ read_pos += 8 ;
5259 return long_value ;
5360 }
5461 public float get_float ( ) {
55- var float_buff = buffer [ pos ..( pos + 4 ) ] ;
62+ var float_buff = buffer [ read_pos ..( read_pos + 4 ) ] ;
5663 if ( is_little_endian ) {
5764 float_buff = float_buff . Reverse ( ) . ToArray ( ) ;
5865 }
5966 float float_value = BitConverter . ToSingle ( float_buff ) ;
60- pos += 4 ;
67+ read_pos += 4 ;
6168 return float_value ;
6269 }
6370 public double get_double ( ) {
64- var double_buff = buffer [ pos ..( pos + 8 ) ] ;
71+ var double_buff = buffer [ read_pos ..( read_pos + 8 ) ] ;
6572 if ( is_little_endian ) {
6673 double_buff = double_buff . Reverse ( ) . ToArray ( ) ;
6774 }
6875 double double_value = BitConverter . ToDouble ( double_buff ) ;
69- pos += 8 ;
76+ read_pos += 8 ;
7077 return double_value ;
7178 }
7279 public string get_str ( ) {
7380 int length = get_int ( ) ;
74- var str_buff = buffer [ pos ..( pos + length ) ] ;
81+ var str_buff = buffer [ read_pos ..( read_pos + length ) ] ;
7582 string str_value = System . Text . Encoding . UTF8 . GetString ( str_buff ) ;
76- pos += length ;
83+ read_pos += length ;
7784 return str_value ;
7885 }
7986 public byte [ ] get_buffer ( ) {
80- return buffer ;
87+ return buffer [ 0 ..this . write_pos ] ;
88+ }
89+ private int max ( int a , int b ) {
90+ if ( a <= b ) {
91+ return b ;
92+ }
93+ return a ;
94+ }
95+ private void extend_buffer ( int space_need ) {
96+ if ( write_pos + space_need >= total_length ) {
97+ total_length = max ( space_need , total_length ) ;
98+ byte [ ] new_buffer = new byte [ total_length * 2 ] ;
99+ buffer . CopyTo ( new_buffer , 0 ) ;
100+ buffer = new_buffer ;
101+ total_length = 2 * total_length ;
102+ }
81103 }
82104 // these for write
83105 public void add_bool ( bool value ) {
84106 var bool_buffer = BitConverter . GetBytes ( value ) ;
85107 if ( is_little_endian ) {
86108 bool_buffer = bool_buffer . Reverse ( ) . ToArray ( ) ;
87109 }
88- write_buffer . AddRange ( BitConverter . GetBytes ( value ) ) ;
89- buffer = write_buffer . ToArray ( ) ;
90- total_length = buffer . Length ;
110+
111+ extend_buffer ( bool_buffer . Length ) ;
112+ bool_buffer . CopyTo ( buffer , write_pos ) ;
113+ write_pos += bool_buffer . Length ;
114+
91115 }
92116 public void add_int ( Int32 value ) {
93117 var int_buff = BitConverter . GetBytes ( value ) ;
94118 if ( is_little_endian ) {
95119 int_buff = int_buff . Reverse ( ) . ToArray ( ) ;
96120 }
97- write_buffer . AddRange ( int_buff ) ;
98- buffer = write_buffer . ToArray ( ) ;
99- total_length = buffer . Length ;
121+
122+ extend_buffer ( int_buff . Length ) ;
123+ int_buff . CopyTo ( buffer , write_pos ) ;
124+ write_pos += int_buff . Length ;
100125 }
101126 public void add_long ( long value ) {
102127 var long_buff = BitConverter . GetBytes ( value ) ;
103128 if ( is_little_endian ) {
104129 long_buff = long_buff . Reverse ( ) . ToArray ( ) ;
105130 }
106- write_buffer . AddRange ( long_buff ) ;
107- buffer = write_buffer . ToArray ( ) ;
108- total_length = buffer . Length ;
131+
132+ extend_buffer ( long_buff . Length ) ;
133+ long_buff . CopyTo ( buffer , write_pos ) ;
134+ write_pos += long_buff . Length ;
135+
109136 }
110137 public void add_float ( float value ) {
111138 var float_buff = BitConverter . GetBytes ( value ) ;
112139 if ( is_little_endian ) {
113140 float_buff = float_buff . Reverse ( ) . ToArray ( ) ;
114141 }
115- write_buffer . AddRange ( float_buff ) ;
116- buffer = write_buffer . ToArray ( ) ;
117- total_length = buffer . Length ;
142+ extend_buffer ( float_buff . Length ) ;
143+ float_buff . CopyTo ( buffer , write_pos ) ;
144+ write_pos += float_buff . Length ;
118145 }
119146 public void add_double ( double value ) {
120147 var double_buff = BitConverter . GetBytes ( value ) ;
121148 if ( is_little_endian ) {
122149 double_buff = double_buff . Reverse ( ) . ToArray ( ) ;
123150 }
124- write_buffer . AddRange ( double_buff ) ;
125- buffer = write_buffer . ToArray ( ) ;
126- total_length = buffer . Length ;
151+ extend_buffer ( double_buff . Length ) ;
152+ double_buff . CopyTo ( buffer , write_pos ) ;
153+ write_pos += double_buff . Length ;
127154 }
128155 public void add_str ( string value ) {
129156 add_int ( value . Length ) ;
130157 var str_buf = System . Text . Encoding . UTF8 . GetBytes ( value ) ;
131- write_buffer . AddRange ( str_buf ) ;
132- buffer = write_buffer . ToArray ( ) ;
133- total_length = buffer . Length ;
158+
159+ extend_buffer ( str_buf . Length ) ;
160+ str_buf . CopyTo ( buffer , write_pos ) ;
161+ write_pos += str_buf . Length ;
134162 }
135163 public void add_char ( char value ) {
136164 var char_buf = BitConverter . GetBytes ( value ) ;
137165 if ( is_little_endian ) {
138166 char_buf = char_buf . Reverse ( ) . ToArray ( ) ;
139167 }
140- write_buffer . AddRange ( char_buf ) ;
141- buffer = write_buffer . ToArray ( ) ;
142- total_length = buffer . Length ;
168+ extend_buffer ( char_buf . Length ) ;
169+ char_buf . CopyTo ( buffer , write_pos ) ;
170+ write_pos += char_buf . Length ;
143171 }
144172
145173 }
0 commit comments