javascript中CERT_FindUserCertByUsage的返回
return of CERT_FindUserCertByUsage in javascript
我试图理解c++ dll和JavaScript之间的关系。有一个js代码:
cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);
其中cert定义为
let cert = null;
但是在c++中,cert是一个结构体
CERTCertificateStr {
char *subjectName;
char *issuerName;
SECItem derCert; /* original DER for the cert */
.... }
我试图在javascript中获得主题名称,我继续使用
代码let a = cert.contents.subjectName;
不成功。它将错误记录为"cannot get content of undefined size"
我在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);
错误cannot get contents of undefined size
发生在以下情况:
var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
this spits out
Error: cannot get contents of undefined size
为了解决这个问题我们这样做:
var b = ctypes.cast(a, ctypes.char.array(5).ptr)
console.log('b:', b.contents);
,这成功地访问了内容,它给了我们(顺便说一下,我用5表示长度,4表示rawr
的长度+ 1表示空终止符但我真的不必这样做,我可以使用长度为4)
CData { length: 5 }
所以现在我们可以像这样读取contents
作为js字符串:
console.log('b:', b.contents.readString());
和这个吐出:
rawr
另外,你说函数返回一个结构体,它返回一个指针到结构体吗?或者实际上是结构?我认为它返回一个指针的结构没有?在这种情况下,你可以这样做:
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();
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值