Mein Freund und ich haben vor einer Weile daran gearbeitet. Es ist für die Verwendung mit js-ctypes gedacht. In Linux gibt es diese Makros für das Hinzufügen einer Liste von Dateideskriptoren (uint32's) zu Byte-Array: FD_SET
und FD_IS_SET
. Die Dokumente sind hier - http://linux.die.net/man/2/selectFD_SET und FD_ISSET Makros geschrieben in Javascript
Ich fragte mich, ob jemand in der Lage wäre zu überprüfen, ob ich das richtig gemacht habe oder weiß jemand von jemandem, der dies in Javascript getan hat? Ich muss die 32bit/64bit-Unterstützung für große und kleine Endianer abschließen, aber wenn es schon da draußen ist, würde ich es gerne sehen, als wir bei der Arbeit so viele Unsicherheiten hatten.
Hier ist der Code, der fd_set_get_idx
war die Hilfsfunktion, auf der alles basiert.
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};
}
}
};
Was ist los mit guten alten '' '' '' '' '' '' ' –
Auch könnte eine' for' Schleife dort verwenden ... –
Ich kann nicht verstehen, wenn Sie nur wollen Emulieren Sie die 'FD_XXX'-Funktionen oder wenn Sie mit etwas konform sein müssen.JS, speziell ES6, hat [DataView] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/DataView) und [typisierte Arrays] (https://developer.mozilla.org/ de-DE/docs/Web/JavaScript/Referenz/Global_Objects/TypedArray), wenn Sie sie verwenden möchten. Jedenfalls, wenn die Semantik von 'FD_SET (i, set)' nur 'set [i] = i' ist, sehe ich kein Problem darin, es in irgendeiner Endianess oder Größe von Grund auf neu zu implementieren. Könntest Du das erläutern? Auch dieses 'fdset [elem8] = 1 << bitpos8' ist wahrscheinlich falsch. –