2012-06-07 2 views
1

Я работаю над аудио-библиотекой в ​​C# и работаю в формате WAVE формата файла ATM. В соответствии с очень информативным website, который я использую, WAVE использует строки стиля Pascal. Я был Googling более 20 минут и пришел только с C to Pascal converter.Паскальные строки в C#

Я знаю, как Pascal и C строки сравнения (код C):

char *cStr = "Test"; // C - produces {'T', 'e', 's', 't', '\0'} 
char pascal[] = {4, 'T', 'e', 's', 't'}; // Pascal 

Если это поможет, я использую System.IO.BinaryReader для разбора файла.

+1

Учитывая приведенную выше информацию, в чем вопрос? :) Представьте, что заканчивается строка Pascal с «\ 0», а «строка C» - это просто указатель на второй символ в строке Pascal ... (если «небезопасно») –

+0

Вы * указали ключевое различие в сообщении *: так в чем вопрос, кроме «написать код для меня»? –

+0

@pst Я не понимаю, как их преобразовать. –

ответ

2

Ну, если вы используете BinaryReader это должно быть довольно легко.

var size = rd.ReadByte(); 
var body = rd.ReadBytes(size); 
var text = System.Text.Encoding.ASCII.GetString(body); 
+0

Wait. Это оно? Я, хотя '.GetString (...)' потребовал нулевой символ в конце массива. Ну что ж. Живи и учись. –

+0

D'oh. Я неправильно понял и был сосредоточен на написании строк Паскаля. Хорошее решение. –

1

Основная идея строки Pascal состоит в том, что первый байт содержит длину строки, а последующие байты содержат строковые данные (ограничение строк до 255 символов).

Я бы работал с байтовым массивом и использовал метод преобразования байтов в C# для его заполнения. См. Принятый ответ на вопрос ниже, чтобы понять, как преобразовать строку C# в массив байтов, и не забывайте смещать все 1 позицию массива, чтобы позволить место для 0-го байта, удерживая длину строки и не забудьте заполнить 0-й байт фактическая длина строки. Проверьте входную длину строки, чтобы убедиться, что это не более 255 символов :-)

How do I get a consistent byte representation of strings in C# without manually specifying an encoding?

+0

Кажется, что размер должен быть 7-битной переменной длины. Ограничение строки до 255 кажется довольно произвольным. – ChaosPandion

+0

@ChaosPandion появились слухи о расширении его на 2 байта. Паскаль, не использующий переменную длину, и C, использующий этот формат, также кажется худшей ошибкой 2 байта. –

+0

@ChaosPandion: Кажется, должно быть, может быть, но это не так. Формат был определен давно, когда целью было использование Pascal в качестве учебного языка для структурированного программирования. –