JavaScript для обработки неподписанных int - PullRequest
0 голосов
/ 26 января 2019

У меня есть несколько функций для преобразования данных (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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...