public unsafe static string toString(this byte[] data, int index, int length, Encoding encoding) { if (encoding != Encoding.ASCII) return encoding.GetString(data, index, length); TmphArray.TmphRange range = new TmphArray.TmphRange(data.length(), index, length); if (range.GetCount == length) { if (range.GetCount != 0) { fixed (byte* dataFixed = data) return Laurent.Lee.CLB.TmphString.DeSerialize(dataFixed + range.SkipCount, -range.GetCount); } return string.Empty; } TmphLog.Error.Throw(TmphLog.TmphExceptionType.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 TmphSubArray<TmphSubString> Split(this string value, int startIndex, int length, char split) { var range = new TmphArray.TmphRange(value.Length(), startIndex, length); if (range.GetCount != length) TmphLog.Error.Throw(TmphLog.TmphExceptionType.IndexOutOfRange); var values = default(TmphSubArray<TmphSubString>); 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(TmphSubString.Unsafe(value, (int)(last - valueFixed), (int)(start - last))); last = ++start; } else ++start; } values.Add(TmphSubString.Unsafe(value, (int)(last - valueFixed), (int)(end - last))); } } return values; }
public void Write(byte[] data, int index, int count) { var range = new TmphArray.TmphRange(data.length(), index, count); if (range.GetCount == count) { PrepLength(count); fixed (byte* dataFixed = data) { Unsafe.TmphMemory.Copy(dataFixed + range.SkipCount, Data + length, count); } length += count; } else if (count != 0) TmphLog.Error.Throw(TmphLog.TmphExceptionType.IndexOutOfRange); }
public void Write(string value, int index, int count) { var range = new TmphArray.TmphRange(value.Length(), index, count); if (range.GetCount == count) { PrepLength(count <<= 1); fixed (char* valueFixed = value) { Unsafe.TmphMemory.Copy(valueFixed + index, Data + length, count); } length += count; } else if (count != 0) TmphLog.Error.Throw(TmphLog.TmphExceptionType.IndexOutOfRange); }
/// <summary> /// 解压缩数据 /// </summary> /// <param name="compressData">压缩数据</param> /// <param name="startIndex">起始位置</param> /// <param name="count">解压缩字节数</param> /// <returns>解压缩后的数据</returns> public TmphSubArray<byte> GetDeCompress(byte[] compressData, int startIndex, int count, TmphMemoryPool memoryPool = null) { if (count > 0) { var range = new TmphArray.TmphRange(compressData.length(), startIndex, count); if (count == range.GetCount) return GetDeCompressUnsafe(compressData, range.SkipCount, count, memoryPool); } TmphLog.Error.Throw(TmphLog.TmphExceptionType.IndexOutOfRange); return default(TmphSubArray<byte>); }
/// <summary> /// 压缩数据 /// </summary> /// <param name="data">原始数据</param> /// <param name="startIndex">起始位置</param> /// <param name="count">压缩字节数</param> /// <param name="seek">起始位置</param> /// <returns>压缩后的数据,失败返回null</returns> public TmphSubArray<byte> GetCompress(byte[] data, int startIndex, int count, int seek = 0, TmphMemoryPool memoryPool = null) { if (seek >= 0) { if (count == 0) return TmphSubArray<byte>.Unsafe(TmphNullValue<byte>.Array, 0, 0); var range = new TmphArray.TmphRange(data.length(), startIndex, count); if (count == range.GetCount) return GetCompressUnsafe(data, startIndex, count, seek, memoryPool); } TmphLog.Error.Throw(TmphLog.TmphExceptionType.IndexOutOfRange); return default(TmphSubArray<byte>); }