2 using System.Collections.Generic;
\r
5 using System.IO.MemoryMappedFiles;
\r
8 namespace NMeCab.Core
\r
10 public static class StrUtils
\r
12 private const byte Nul = (byte)0;
\r
15 /// バイト配列の中から終端が\0で表された文字列を取り出す。
\r
18 /// バイト配列の長さはInt32.MaxValueを超えていても良い。
\r
20 /// <param name="bytes">バイト配列</param>
\r
21 /// <param name="enc">文字エンコーディング</param>
\r
22 /// <returns>文字列(\0は含まない)</returns>
\r
23 public static string GetString(byte[] bytes, Encoding enc)
\r
25 return StrUtils.GetString(bytes, 0L, enc);
\r
29 /// バイト配列の中から終端が\0で表された文字列を取り出す。
\r
32 /// バイト配列の長さはInt32.MaxValueを超えていても良い。
\r
34 /// <param name="bytes">バイト配列</param>
\r
35 /// <param name="offset">オフセット位置</param>
\r
36 /// <param name="enc">文字エンコーディング</param>
\r
37 /// <returns>文字列(\0は含まない)</returns>
\r
38 public unsafe static string GetString(byte[] bytes, long offset, Encoding enc)
\r
40 fixed (byte* pBytes = bytes)
\r
41 return StrUtils.GetString(pBytes + offset, enc);
\r
45 /// バイト配列の中から終端が\0で表された文字列を取り出す。
\r
48 /// バイト配列の長さはInt32.MaxValueを超えていても良い。
\r
50 /// <param name="bytes">デコードする最初のバイトへのポインタ</param>
\r
51 /// <param name="enc">文字エンコーディング</param>
\r
52 /// <returns>文字列(\0は含まない)</returns>
\r
53 public unsafe static string GetString(byte* bytes, Encoding enc)
\r
57 while (*bytes != Nul) //終端\0に到達するまでシーク
\r
59 checked { byteCount++; } //文字列のバイト長がInt32.MaxValueを超えたならエラー
\r
64 //生成されうる最大文字数のバッファを確保
\r
65 int maxCharCount = enc.GetMaxCharCount(byteCount);
\r
66 fixed (char* buff = new char[maxCharCount])
\r
69 int len = enc.GetChars(bytes, byteCount, buff, maxCharCount);
\r
70 return new string(buff, 0, len);
\r
77 /// MemoryMappedViewAccessorから終端が\0で表された文字列を取り出す。
\r
80 /// MemoryMappedViewAccessorの容量はInt32.MaxValueを超えていても良い。
\r
82 /// <param name="accessor">MemoryMappedViewAccessor</param>
\r
83 /// <param name="index">オフセット位置</param>
\r
84 /// <param name="enc">文字エンコーディング</param>
\r
85 /// <param name="buffSize">内部で使用するバッファの初期サイズ</param>
\r
86 /// <returns>文字列(\0は含まない)</returns>
\r
87 public static string GetString(MemoryMappedViewAccessor accessor, long offset, Encoding enc,
\r
90 byte[] buff = new byte[buffSize]; //IO回数削減のためのバッファ配列
\r
91 accessor.ReadArray<byte>(offset, buff, 0, buffSize); //初期読込
\r
95 while (buff[byteCount] != Nul) //終端\0に到達するまでシーク
\r
99 if (byteCount == buffSize) //バッファ配列の終端
\r
102 checked { buffSize *= 2; } //Int32.MaxValueを超えたならエラー
\r
103 byte[] newBuff = new byte[buffSize];
\r
104 Buffer.BlockCopy(buff, 0, newBuff, 0, byteCount);
\r
105 accessor.ReadArray<byte>(offset + byteCount, newBuff, byteCount, buffSize - byteCount);
\r
111 return enc.GetString(buff, 0, byteCount);
\r