/// <summary> /// 写数据 /// </summary> /// <param name="data">数据</param> /// <param name="index">起始位置</param> /// <param name="count">写入字节数</param> public void Write(byte[] data, int index, int count) { var range = new ArrayPlus.RangeStruct(data.Length, index, count); if (range.GetCount == count) { PrepLength(count); fixed (byte* dataFixed = data) { MemoryUnsafe.Copy(dataFixed + range.SkipCount, Data + Length, count); } LengthBase += count; } else if (count != 0) LogPlus.Error.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange); }
/// <summary> /// 写字符串 /// </summary> /// <param name="value">字符串</param> /// <param name="index">起始位置</param> /// <param name="count">写入字符数</param> public void WriteBase(string value, int index, int count) { var range = new ArrayPlus.RangeStruct(value.Length, index, count); if (range.GetCount == count) { PrepLengthBase(count <<= 1); fixed (char* valueFixed = value) { MemoryUnsafe.Copy(valueFixed + index, Data + LengthBase, count); } LengthBase += count; } else if (count != 0) LogPlus.Error.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange); }
/// <summary> /// 转换成字节数组 /// </summary> /// <param name="index">起始位置</param> /// <param name="count">字节数</param> /// <returns>字节数组</returns> public byte[] GetArray(int index, int count) { var range = new ArrayPlus.RangeStruct(Length, index, count); if (count == range.GetCount) { var data = new byte[count]; MemoryUnsafe.Copy(Data + index, data, count); return data; } if (count == 0) return null; LogPlus.Default.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange); return null; }
/// <summary> /// 分割字符串 /// </summary> /// <param name="value">原字符串</param> /// <param name="startIndex">起始位置</param> /// <param name="length">分割字符串长度</param> /// <param name="split">分割符</param> /// <returns>字符子串集合</returns> public static SubArrayStruct<SubStringStruct> Split(this string value, int startIndex, int length, char split) { var range = new ArrayPlus.RangeStruct(value.Length(), startIndex, length); if (range.GetCount != length) LogPlus.Error.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange); var values = default(SubArrayStruct<SubStringStruct>); if (value != null) { fixed (char* valueFixed = value) { char* last = valueFixed + range.SkipCount, end = last + range.GetCount; for (var start = last; start != end;) { if (*start == split) { values.Add(SubStringStruct.Unsafe(value, (int) (last - valueFixed), (int) (start - last))); last = ++start; } else ++start; } values.Add(SubStringStruct.Unsafe(value, (int) (last - valueFixed), (int) (end - last))); } } return values; }