По умолчанию используется возврат неизмененного документа. Если вы хотите, чтобы новый, обновленный документ возвращался, вам нужно передать дополнительный аргумент: объект с свойством new
, установленным на true
.
http://mongoosejs.com /docs/api.html#model_Model.findOneAndUpdate
Запрос # findOneAndUpdate
function(error, doc) {
// error: any errors that occurred
// doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}
Доступные опции
new
: bool - если true, вернуть измененный документ, а не оригинал. defaults to false (изменено в 4.0)
Итак, если вы хотите обновленный результат в переменной doc
:
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}
console.log(doc);
});
Я подумал, что, возможно, вы могли бы преобразовать байты в их двоичное представление, а затем объединить 3 из них, чтобы получить 3 байта для диапазона 16 777 216, но эта теория неверна из того, что я могу сказать.
blockquote>Не уверен, почему это не сработало для вас.
Каждый образец должен быть закодирован, либо с большим или прямым порядком байтов . Вот некоторые методы из библиотеки обработки аудио jipes , которые показывают, как вы можете декодировать байты в сэмплы от младшего или старшего до
int
:private static int byteToIntLittleEndian(final byte[] buf, final int offset, final int bytesPerSample) { int sample = 0; for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { final int aByte = buf[offset + byteIndex] & 0xff; sample += aByte << 8 * (byteIndex); } return sample; } private static int byteToIntBigEndian(final byte[] buf, final int offset, final int bytesPerSample) { int sample = 0; for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { final int aByte = buf[offset + byteIndex] & 0xff; sample += aByte << (8 * (bytesPerSample - byteIndex - 1)); } return sample; }
Как только значение будет декодировано Вы все еще должны привести к вашему целевому интервалу. Если вы заинтересованы в 2-байтовом формате, то есть глубине 16 бит, вы просто сделаете это:
final int sample = byteToIntLittleEndian(buf, sampleOffset, bytesPerChannel); final short shortSample = (short)sample;
Приведение заботится о переполнении.
1113 С 3 байтами все немного сложнее. Вы должны знать диапазон значений в первую очередь. Обратите внимание, что поскольку вы заинтересованы в знаковых значениях, это не[0,2^24]
, а:
/** * A constant holding the minimum value a <code>signed24bit</code> can * have, -2<sup>22</sup>. */ private static final int MIN_VALUE_24BIT = -2 << 22; /** * A constant holding the maximum value a <code>signed24bit</code> can * have, 2<sup>22</sup>-1. */ private static final int MAX_VALUE_24BIT = -MIN_VALUE_24BIT-1;
Затем вы используете это для преобразования в знаковое значение образца, например:
final int sample = byteToIntLittleEndian(bud, sampleOffset, bytesPerChannel); final int threeByteSample = sample > MAX_VALUE_24BIT ? sample + MIN_VALUE_24BIT + MIN_VALUE_24BIT : sample;