Самый быстрый способ преобразовать possibly-null-terminated байт ASCII [] к строке?

Алгоритмы от стандартных берут итераторы, а не контейнеры, так что вы можете использовать их:

auto it = std::find(a.begin(), a.begin() + 2, 'b');
if (it != a.begin() + 2) {
    // found.
}
18
задан Wayne Bloss 27 September 2008 в 18:13
поделиться

4 ответа

Какая-либо причина не использовать String(sbyte*, int, int) конструктор? Если Вы удались, в какой части буфера Вы нуждаетесь, остальные должны быть простыми:

public static string UnsafeAsciiBytesToString(byte[] buffer, int offset, int length)
{
    unsafe
    {
       fixed (byte* pAscii = buffer)
       { 
           return new String((sbyte*)pAscii, offset, length);
       }
    }
}

, Если необходимо выглядеть первыми:

public static string UnsafeAsciiBytesToString(byte[] buffer, int offset)
{
    int end = offset;
    while (end < buffer.Length && buffer[end] != 0)
    {
        end++;
    }
    unsafe
    {
       fixed (byte* pAscii = buffer)
       { 
           return new String((sbyte*)pAscii, offset, end - offset);
       }
    }
}

, Если это действительно - строка ASCII (т.е. все байты меньше чем 128) затем проблемой кодовой страницы не должна быть проблема, если Вы не имеете особенно странная кодовая страница по умолчанию, которая не основана на ASCII.

Из интереса, Вы на самом деле представили свое приложение, чтобы удостовериться, что это - действительно узкое место? Вам определенно нужно абсолютное самое быстрое преобразование вместо того, которое более читаемо (например, использующий Кодирование. GetString для соответствующего кодирования)?

11
ответ дан 30 November 2019 в 07:34
поделиться

Одна возможность рассмотреть: проверьте, что кодовая страница по умолчанию приемлема, и используйте ту информацию для выбора механизма преобразования во времени выполнения.

Это могло также принять во внимание, завершается ли строка на самом деле пустым указателем, но после того как Вы сделали это, конечно, выигрыши в быстродействии мой исчезать.

1
ответ дан 30 November 2019 в 07:34
поделиться

Я не уверен в скорости, но я обнаружил, что проще всего использовать LINQ для удаления нулей перед кодированием:

string s = myEncoding.GetString(bytes.TakeWhile(b => !b.Equals(0)).ToArray());
3
ответ дан 30 November 2019 в 07:34
поделиться

Это немного некрасиво, но вам не нужно использовать небезопасный код:

string result = "";
for (int i = 0; i < data.Length && data[i] != 0; i++)
   result += (char)data[i];
-1
ответ дан 30 November 2019 в 07:34
поделиться
Другие вопросы по тегам:

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