Главная » Программирование звука » Чтение и запись целых чисел

0

При  чтении  и  записи  целых  чисел,  занимающих  несколько  байтов,  требуется соблюдать  определенный  порядок.  Чтобы  обеспечить  переносимость, вам  следует за один прием всегда считывать один байт и тщательно  компоновать многобайтные целые числа.

Метод ReadIntMsb позволяет считать целое число, начиная со старшего разряда. Такой формат записи известен под названиями тупоконечный (big-endian), сетевой или формат фирмы Motorola. B противоположность этому метод ReadIntLsb считывает  целое  число,  начиная  с  младшего  разряда.  Этот  формат  записи  называется  остроконечным  (little-endian),  форматом  VAX  или  форматом  Intel.  Методы BytesToIntxxx используют указатели вместо объектов типа istream.

Листинг 4.5. Объявление вспомогательных элементов класса AudioAbstract (продолжение)

long ReadIntMsb(istream &in, int bytes); long BytesToIntMsb(void *buff, int bytes); long ReadIntLsb(istream &in, int bytes); long BytesToIntLsb(void *buff, int bytes); void SkipBytes(istream &in, int bytes);

Листинг 4.11. Определение вспомогательных элементов клacca

AudioAbstract

long ReadIntMsb(istream &in, int size) {

if (size < = 0) return 0;

long l = ReadIntMsb(in,size-1) << 8;

l |= static_cast<long>(in.get()) & 255;

return l;

}

long BytesToIntMsb(void *vBuff, int size) {

unsigned char *buff = reinterpret_cast<unsigned char

*>(vBuff);

if (size <= 0) return 0;

long l = BytesToIntMsb(buff,size-1) << 8;

l |= static_cast<long>(buff[size-1]) & 255;

return l;

}

long ReadIntLsb(istream &in, int size) {

if (size <= 0) return 0;

long l = static_cast<long>(in.get()) & 255;

l |= ReadIntLsb(in,size-1)<<8;

return l;

}

long BytesToIntLsb(void *vBuff, int size) {

unsigned char *buff = reinterpret_cast<unsigned char

*>(vBuff);

if (size <= 0) return 0;

long 1 = static_cast<long>(*buff) & 255; l |= BytesToIntLsb(buff+1,size-1)<<8; return l;

}

void SkipBytes(istream &in, int size) {

while (size-> 0)

in.get();

}

Запись   целых   чисел,   состоящих   из   нескольких   байтов,   требует   аналогичной аккуратности.

Листинг 4.5. Объявление вспомогательных элементов класса AudioAbstract (продолжение)

void WriteIntMsb(ostream &out, long l, int bytes);

void WriteIntLsb(ostream &out, long l, int bytes);

Листинг 4.11. Определение вспомогательных элементов класса AudioAbstract

void WriteIntMsb(ostream &out, long l, int size) {

if (size <= 0) return;

WriteIntMsb(out, l>>8, size-1);      // Пишем старшие  байты.

out.put(l&255);                      // Пишем младший   байт.

}

void WriteIntLsb(ostream &out, long l, int size) {

if (size <= 0) return;

out.put(l&255);                      // Пишем младший   байт.

WriteIntLsb(out, l>>8, size-1);      // Пишем все остальное.

}

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии