Максимальная длина поля заголовка Типа контента MIME?

Есть много подходов к этому,

Учитывая

var lines = File.ReadLines(@"D:\Test.txt");

Примечание : File.ReadLines возврат Enumerbale, поэтому он будет загружать каждую строку лениво


Вариант 1 : регулярное выражение с использованием Положительного отстранения и шаблона (?<=2:\[X:)\d+ [ 1123]

foreach (var line in lines)
{
   var match = Regex.Match(line,@"(?<=2:\[X:)\d+");
   if(match.Success)
      Console.WriteLine(match.Value);  
}

Вариант 2 : Простой string.Split

foreach (var line in lines)
{
   var results = line.Split(new[] { "2:[X:", "][Y:" }, StringSplitOptions.RemoveEmptyEntries);

   if(results.Length>1)
      Console.WriteLine(results[1]);
}

Вариант 3 : «Возможно», более производительный подход с использованием [1115 ] Указатели fixed и unsafe

public static unsafe (bool found, int value) ParseLine(string line)
{
   const string prefix = "2:[X:"; 
   fixed (char* pLine = line,pPrefix = prefix)
   {

      var pLen = line.Length + pLine;
      var found = false;
      var result = 0;
      var i = 0;
      for (char* p = pLine ,pP = pPrefix; p < pLen; p++)
      {
         if (!found )
         {
            if( *p == *(pP+i)) i++;
            if( i ==prefix.Length) found = true;
            continue;
         }

         if (*p < '0' || *p > '9')
            break;

         result = result * 10 + *p - '0';


      }

      return (found, result);
   }
}

...

var results = File.ReadLines(@"D:\Test.txt")
                  .Select(ParseLine)
                  .Where(result => result.found)
                  .Select(result => result.value);

foreach (var result in results)
   Console.WriteLine(result);

Примечание : речь идет не об использовании регулярных выражений, а о различных подходах. [ 1126]

Я не отмечал это, однако я подозреваю, что Указатели будут самыми быстрыми, split будут следующими, а Regex , возможно, будут самыми медленными (даже если используя скомпилированный), однако это наиболее читаемый и поддерживаемый, а также надежный подход (именно поэтому я поставил его первым)

Тесты

+----------+------------+-----------+-----------+
|  Method  |    Mean    |   Error   |  StdDev   |
+----------+------------+-----------+-----------+
| RegEx    | 3,358.3 us | 65.169 us | 66.923 us |
| Split    | 1,980.9 us | 38.440 us | 48.614 us |
| Pointers | 287.4 us   | 4.396 us  | 4.112 us  |
+----------+------------+-----------+-----------+

Тестовый код [ 1128]

public class Test
{
   private Regex _regex;

   private string[] data;

   [GlobalSetup]
   public void Setup()
   {
      _regex = new Regex(@"(?<=2:\[X:)\d+", RegexOptions.Compiled);

      data = File.ReadLines(@"D:\Test3.txt")
                 .ToArray();
   }

   [Benchmark]
   public List<int> RegEx()
   {
      return data.Select(line => _regex.Match(line))
                 .Where(x => x.Success)
                 .Select(match => int.Parse(match.Value))
                 .ToList();
   }

   [Benchmark]
   public List<int> Split()
   {
      return data.Select(line => line.Split(new[] { "2:[X:", "][Y:" }, StringSplitOptions.RemoveEmptyEntries))
                 .Where(results => results.Length > 1)
                 .Select(results => int.Parse(results[1]))
                 .ToList();
   }

   [Benchmark]
   public List<int> Pointers()
   {
      return data.Select(ParseLine)
                 .Where(result => result.found)
                 .Select(result => result.value)
                 .ToList();
   }

   public static unsafe (bool found, int value) ParseLine(string line)
   {
      const string prefix = "2:[X:"; 
      fixed (char* pLine = line,pPrefix = prefix)
      {

         var pLen = line.Length + pLine;
         var found = false;
         var result = 0;
         var i = 0;
         for (char* p = pLine ,pP = pPrefix; p < pLen; p++)
         {
            if (!found )
            {
               if( *p == *(pP+i)) i++;
               if( i ==prefix.Length) found = true;
               continue;
            }

            if (*p < '0' || *p > '9')
               break;

            result = result * 10 + *p - '0';


         }

         return (found, result);
      }
   }
}
35
задан Ian Nelson 21 August 2008 в 13:23
поделиться

2 ответа

Надеюсь, я правильно прочитал, но похоже, что максимальная длина составляет 127/127 или 255 всего .

RFC 4288 содержит ссылку в 4.2 (стр. 6):

Type and subtype names MUST conform to the following ABNF:

   type-name = reg-name
   subtype-name = reg-name

   reg-name = 1*127reg-name-chars
   reg-name-chars = ALPHA / DIGIT / "!" /
                   "#" / "$" / "&" / "." /
                   "+" / "-" / "^" / "_"

Мне не ясно, может ли суффикс + добавляться после 127, но похоже, что нет.

44
ответ дан 27 November 2019 в 07:16
поделиться

Мы выполняем систему SaaS, которая позволяет пользователям загружать файлы. Мы первоначально разработали его для хранения Типов MIME до 50 символов. За прошлые несколько дней мы видели несколько попыток загрузить 71-байтовые типы. Так, мы изменяемся на 250. 100 казался "хорошим", но это - еще много, чем макс., которое мы видим теперь. 500 кажется глупым, таким образом, 250 выбранный.

1
ответ дан 27 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: