Мы с другом работали над этим некоторое время назад. Он предназначен для использования с js-ctypes. В Linux есть эти макросы для работы с добавлением списка файловых дескрипторов (uint32) в байтовый массив: FD_SET
и FD_IS_SET
. Документы находятся здесь - http://linux.die.net/man/2/select
Мне было интересно, сможет ли кто-нибудь проверить, правильно ли я это сделал, или кто-нибудь знает кого-нибудь, кто сделал это в javascript? Мне нужно завершить 32-битную / 64-битную поддержку для прямого и прямого порядка байтов, но если она уже существует, я бы хотел ее увидеть, поскольку, когда мы работали над этим, у нас было так много неопределенностей.
Вот код, fd_set_get_idx
была вспомогательной функцией, на которой все это основано.
var MACROS = {
fd_set_set: function(fdset, fd) {
let { elem8, bitpos8 } = MACROS.fd_set_get_idx(fd);
console.info('elem8:', elem8.toString());
console.info('bitpos8:', bitpos8.toString());
fdset[elem8] = 1 << bitpos8;
},
fd_set_isset: function(fdset, fd) {
let { elem8, bitpos8 } = MACROS.fd_set_get_idx(fd);
console.info('elem8:', elem8.toString());
console.info('bitpos8:', bitpos8.toString());
return !!(fdset[elem8] & (1 << bitpos8));
},
fd_set_get_idx: function(fd) {
if (osname == 'darwin' /*is_mac*/) {
// We have an array of int32. This should hopefully work on Darwin
// 32 and 64 bit.
let elem32 = Math.floor(fd / 32);
let bitpos32 = fd % 32;
let elem8 = elem32 * 8;
let bitpos8 = bitpos32;
if (bitpos8 >= 8) { // 8
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 16
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 24
bitpos8 -= 8;
elem8++;
}
return {'elem8': elem8, 'bitpos8': bitpos8};
} else { // else if (osname == 'linux' /*is_linux*/) { // removed the else if so this supports bsd and solaris now
// :todo: add 32bit support
// Unfortunately, we actually have an array of long ints, which is
// a) platform dependent and b) not handled by typed arrays. We manually
// figure out which byte we should be in. We assume a 64-bit platform
// that is little endian (aka x86_64 linux).
let elem64 = Math.floor(fd / 64);
let bitpos64 = fd % 64;
let elem8 = elem64 * 8;
let bitpos8 = bitpos64;
if (bitpos8 >= 8) { // 8
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 16
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 24
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 32
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 40
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 48
bitpos8 -= 8;
elem8++;
}
if (bitpos8 >= 8) { // 56
bitpos8 -= 8;
elem8++;
}
return {'elem8': elem8, 'bitpos8': bitpos8};
}
}
};
>>
,<<
и&
,|
- person Antti Haapala   schedule 19.07.2016for
... - person Antti Haapala   schedule 19.07.2016FD_XXX
или вам нужно соответствовать чему-то. JS, особенно ES6, имеет DataView и типизированные массивы, если вы хотите их использовать. В любом случае, если семантикаFD_SET(i, set)
- это простоset[i] = i
, я не вижу никаких проблем с ее реализацией, с любым порядком байтов или размером, с нуля. Вы можете уточнить? Также этоfdset[elem8] = 1 << bitpos8
скорее всего неверно. - person Margaret Bloom   schedule 19.07.2016FD_XXX
, ничего не согласовывая. Честно говоря, это было много лет назад, и я не могу вспомнить, верна ли эта семантика. Я так не думаю, поскольку, когда я только что использовал это, индексidx
в приведенном выше коде был другим. (именно поэтому я добавил теги для linux и c к этому вопросу. Я знаю, что он может быть закрыт, но мне больше не у кого спросить, кто обладает такими знаниями. Все мои навыки позволяют использовать эти функции) - person Noitidart   schedule 19.07.2016