К сожалению, вы не можете использовать десятичные числа в значениях атрибутов, так как сам CLR на самом деле не знает о типе System.Decimal
- это не примитивный тип, такой как int, double и т. Д. Компилятор C # в основном подделывает его для константных полей введите десятичное число, но оно не может достичь того же эффекта с атрибутами.
Из спецификации C # 3, раздел 17.1.3:
Типы позиционных и именованных параметров для класса атрибута ограничены типами параметров атрибута, которые являются:
- Один из следующих типов: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort.
- Тип объекта.
- Тип System.Type.
- Тип enum при условии, что он имеет общедоступную доступность, а типы, в которые он вложен (если есть), также имеют общедоступную доступность (§17.2).
- Одномерные массивы вышеуказанных типов.
Далее в разделе 17.2:
Выражение E является выражением атрибут-аргумент, если все следующие утверждения> true:
- Тип E является типом параметра атрибута (§17.1.3).
- Во время компиляции значение E может быть преобразовано в одно из следующих значений:
- Постоянное значение.
- Объект System.Type.
- Одномерный массив выражений атрибут-аргумент.
Предупреждение: целые числа и байты подписаны. Возможно, вам нужно замаскировать младшие байты при их объединении:
for (int i =0; i < length; i += 4) {
double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));
... your code here ...
}
Little Endian означает, что данные имеют формат BBAA и DDCC. Вы бы просто поменяли его местами.
С начала кадра:
int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];
, где i - ваш индекс вашего образца.
Я бы лично поискал библиотеку, которая выполняет обратную замену за вас. Каждый формат аудиофайла имеет предположения о порядке байтов для вас, и получить это правильно сложно для всех поддерживаемых волновых файлов с битовой глубиной / типами данных:
Если вы хотите поддерживать наиболее распространенные типы файлов wave, вам потребуются преобразования с порядком байтов для всех этих типов данных.
Я бы посмотрел на ByteSwapper , который предоставит вам перестановку байтов для большинства типов, перечисленных выше.
Жаль, что Java не имеет поля порядка байтов в своих классах файлового ввода-вывода. Возможность просто открыть файл большой или небольшой - гораздо более простое решение этой проблемы.
Когда вы используете ByteBuffer ( java.nio.ByteBuffer ), вы можете использовать порядок методов;
[порядок]
публичный окончательный порядок байтового буфера (ByteOrder bo)
Modifies this buffer's byte order.
Parameters:
bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
This buffer
После этого вы можете получить вышеупомянутые значения с помощью;
getChar () getShort () getInt () getFloat () getDouble ()
Какой отличный язык - это Java ;-)