У меня есть несколько функций для преобразования данных (setbitu, setbits и set38bits) и преобразования в JS (setbitu, setbits и set38bits), ответ не получился прежним. Кто-нибудь может указать мне, где я делаю неправильно?
Спасибо
Dan
void setbitu(unsigned char *buff, int pos, int len, unsigned int data)
{
unsigned int mask=1u<<(len-1);
int i;
if (len<=0||32<len) return;
for (i=pos;i<pos+len;i++,mask>>=1) {
if (data&mask)
buff[i/8]|=1u<<(7-i%8);
else
buff[i/8]&=~(1u<<(7-i%8));
}
}
void setbits(unsigned char *buff, int pos, int len, int data)
{
if (data<0)
data|=1<<(len-1);
else
data&=~(1<<(len-1)); /* set sign bit */
setbitu(buff,pos,len,(unsigned int)data);
}
/* set signed 38 bit field ---------------------------------------------------*/
void set38bits(unsigned char *buff, int pos, double value)
{
int word_h=(int)floor(value/64.0);
unsigned int word_l=(unsigned int)(value-word_h*64.0);
setbits(buff,pos ,32,word_h);
setbitu(buff,pos+32,6,word_l);
}
Я преобразовал в функцию JS следующим образом:
/* set signed 38 bit field ---------------------------------------------------*/
function set38bits(buff, pos, value)
{
var word_l = new Uint32Array(1);
var word_h=Math.floor(value/64.0);
word_l[0]=(value-word_h*64.0);
buff = setbits(buff,pos ,32,word_h);
buff = setbitu(buff,pos+32,6,word_l);
return buff;
}
function setbitu(buff, pos, len, data)
{
var mask=1<<(len-1);
var i = 0;
if (len<=0||32<len) return buff;
for (i=pos;i<pos+len;i++,mask>>=1) {
var loc = Math.floor(i/8);
if (data&mask) {
buff[loc]|=1<(7-i%8);
} else {
buff[loc]&=~(1<<(7-i%8));
}
}
return buff;
}
function setbits(buff, pos, len, data)
{
if (data<0) {
data|=1<<(len-1);
} else {
data&=~(1<<(len-1)); /* set sign bit */
}
return setbitu(buff,pos,len, data);
}