unsafe public Node <T> From_Bytes(byte[] buffer, int order) { var byteCount = Size_In_Bytes(order); var keySize = Serializer.Serialized_Size_For_Single_Key_In_Bytes(); int key_Num; fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff; Unsafe_Utilities.Memcpy((byte *)&key_Num, shifted, 4); } bool isLeaf = buffer[4] == 1; var node = Create_New(isLeaf); node.Key_Num = key_Num; node.Keys = Serializer.Get_Instances(buffer, 5, order); int offset = 5 + keySize * order; fixed(long *p_Pointers = &node.Pointers[0]) fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff + offset; Unsafe_Utilities.Memcpy((byte *)p_Pointers, shifted, 8 * (key_Num + 1)); } if (IsClustered && node.IsLeaf) { offset += 8 * (node.Pointers.Length); fixed(byte *p_Data = &node.Data[0, 0]) fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff + offset; Unsafe_Utilities.Memcpy(p_Data, shifted, Clustered_Data_Size * (key_Num + 1)); } //for (int i = 1; i < key_Num + 1; i++) // node.Data[i] = Clustered_Data<T>.From_Bytes(buffer, offset + i * Clustered_Data_Size, Clustered_Data_Size); } return(node); }
unsafe public void To_Bytes_In_Buffer(Node <T> node, byte[] buffer, int startIndex) { int key_Num = node.Key_Num; int keySize = Serializer.Serialized_Size_For_Single_Key_In_Bytes(); fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff + startIndex; Unsafe_Utilities.Memcpy(shifted, (byte *)&key_Num, 4); } buffer[startIndex + 4] = node.IsLeaf ? (byte)1 : (byte)0; int offset = startIndex + 5; Serializer.To_Buffer(node.Keys, key_Num, buffer, offset); offset += keySize * node.Keys.Length; fixed(long *p_Pointers = &node.Pointers[0]) fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff + offset; Unsafe_Utilities.Memcpy(shifted, (byte *)p_Pointers, 8 * (key_Num + 1)); } if (IsClustered && node.IsLeaf) { offset += 8 * (node.Pointers.Length); fixed(byte *p_Data = &node.Data[0, 0]) fixed(byte *p_buff = &buffer[0]) { byte *shifted = p_buff + offset; Unsafe_Utilities.Memcpy(shifted, p_Data, Clustered_Data_Size * (key_Num + 1)); } //for (int i = 1; i < key_Num + 1; i++) // node.Data[i].Write_To_Buffer(buffer, offset + i * Clustered_Data_Size); } }