返回javascript中的CERT_FindUserByUsage 我试图理解C++ DLL与JavaScript之间的关系。 有一个js代码: cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

返回javascript中的CERT_FindUserByUsage 我试图理解C++ DLL与JavaScript之间的关系。 有一个js代码: cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);,javascript,c++,firefox-addon,jsctypes,nss,Javascript,C++,Firefox Addon,Jsctypes,Nss,其中cert定义为 let cert = null; 但是,在C++中,CERP是一个结构< /P> CERTCertificateStr { char *subjectName; char *issuerName; SECItem derCert; /* original DER for the cert */ .... } 我正在尝试用javascript获取主题名称,并使用 let a = cert.contents.subject

其中cert定义为

let cert = null;
<>但是,在C++中,CERP是一个结构< /P>
CERTCertificateStr {
    char *subjectName;
    char *issuerName;
    SECItem derCert;            /* original DER for the cert */
    .... }
我正在尝试用javascript获取主题名称,并使用

let a = cert.contents.subjectName; 
这是不成功的。它将错误记录为“无法获取未定义大小的内容”

我在C++和JavaScript之间错过了什么?
如何在javascript中打印subjectName?

我认为您正在使用jsctypes,并且走在了正确的道路上。要获取js字符串,尽管在将其强制转换为具有特定长度的数组后必须标记
readString()
,但可以超过实际长度,因为
readString()
将一直读取到第一个空字符,即
\x00
。虽然如果您知道确切的长度,这总是最好的(对于空项,您不必使用长度+1),因为这样可以节省内存,因为您不必不必要地分配超过所需长度的缓冲区(jsctypes中的数组)

所以试试这个:

let a = ctypes.cast(cert.contents.subjectName, ctypes.char.array(100).ptr).contents.readString();
console.log('a:', a);
错误
无法获取未定义大小的内容
发生在以下情况:

var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
console.log('b:', b.contents.readString());
这个吐出来了

错误:无法获取未定义大小的内容

为了解决这个问题,我们要做的是:

var b = ctypes.cast(a, ctypes.char.array(5).ptr)
console.log('b:', b.contents);
这成功地访问了内容,它给了我们(顺便说一下,我用5表示长度,4表示长度
rawr
+1表示空终止符,但我真的不必这么做,我可以用4表示长度)

CData{length:5}

现在我们可以将
内容
作为js字符串读取,如下所示:

var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
console.log('b:', b.contents.readString());
这就表明:

rawr

另外,您说过函数返回一个结构,它是否返回指向该结构的指针?或者实际上是结构?我想它会返回一个指向结构no的指针?因此,在这种情况下,您可以这样做:

let certPtr = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

let certStruct = ctypes.StructType('CERTCertificateStr', [
   {'subjectName': ctypes.char.ptr},
   {issuerName: ctypes.char.ptr},
   {derCert: ctypes.voidptr_t}
]);

let cert = ctypes.cast(certPtr, certStruct.ptr).contents;
let a = cert.contents.subjectName.readString();

我认为您正在进行jsctypes,并且您走在了正确的轨道上。要获取js字符串,尽管在将其强制转换为具有特定长度的数组后必须标记
readString()
,但可以超过实际长度,因为
readString()
将一直读取到第一个空字符,即
\x00
。虽然如果您知道确切的长度,这总是最好的(对于空项,您不必使用长度+1),因为这样可以节省内存,因为您不必不必要地分配超过所需长度的缓冲区(jsctypes中的数组)

所以试试这个:

let a = ctypes.cast(cert.contents.subjectName, ctypes.char.array(100).ptr).contents.readString();
console.log('a:', a);
错误
无法获取未定义大小的内容
发生在以下情况:

var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
console.log('b:', b.contents.readString());
这个吐出来了

错误:无法获取未定义大小的内容

为了解决这个问题,我们要做的是:

var b = ctypes.cast(a, ctypes.char.array(5).ptr)
console.log('b:', b.contents);
这成功地访问了内容,它给了我们(顺便说一下,我用5表示长度,4表示长度
rawr
+1表示空终止符,但我真的不必这么做,我可以用4表示长度)

CData{length:5}

现在我们可以将
内容
作为js字符串读取,如下所示:

var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
console.log('b:', b.contents.readString());
这就表明:

rawr

另外,您说过函数返回一个结构,它是否返回指向该结构的指针?或者实际上是结构?我想它会返回一个指向结构no的指针?因此,在这种情况下,您可以这样做:

let certPtr = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

let certStruct = ctypes.StructType('CERTCertificateStr', [
   {'subjectName': ctypes.char.ptr},
   {issuerName: ctypes.char.ptr},
   {derCert: ctypes.voidptr_t}
]);

let cert = ctypes.cast(certPtr, certStruct.ptr).contents;
let a = cert.contents.subjectName.readString();

在C++中,可以使用<代码>放置> /Cuff>函数输出CtTraceQueTestSTR结构的<代码>主题名称<代码>吗?可能您需要使用ASN1解析器。是的,我可以访问subjectName,而不需要C++中的ASN1解析器,所以您尝试使用js ctypes?在C++中,可以使用<代码>放置> /Cuff>函数输出CtTraceQueTestSTR结构的<代码>主题名称<代码>吗?可能您需要使用ASN1解析器。是的,我可以访问subjectName,而不需要C++中的ASN1解析器,所以您尝试使用js ctypes?在C++中,可以使用<代码>放置> /Cuff>函数输出CtTraceQueTestSTR结构的<代码>主题名称<代码>吗?可能您需要使用ASN1解析器。是的,我可以访问subjectName,而不需要C++中的ASN1解析器,所以您尝试使用js ctypes?它很漂亮。谢谢你,诺伊蒂达特。它很漂亮。谢谢你,诺伊蒂达特。它很漂亮。谢谢你,诺伊蒂德。