我想从NSTextField中的NSString get传递给void *的方法,所以我确实这样:
(这是为OS X上的钥匙串访问添加新密码)
function fnExcelReport()
{
var tab_text = '<table border="1px" style="font-size:20px" ">';
var textRange;
var j = 0;
var tab = document.getElementById('DataTableId'); // id of table
var lines = tab.rows.length;
// the first headline of the table
if (lines > 0) {
tab_text = tab_text + '<tr bgcolor="#DFDFDF">' + tab.rows[0].innerHTML + '</tr>';
}
// table data lines, loop starting from 1
for (j = 1 ; j < lines; j++) {
tab_text = tab_text + "<tr>" + tab.rows[j].innerHTML + "</tr>";
}
tab_text = tab_text + "</table>";
tab_text = tab_text.replace(/<A[^>]*>|<\/A>/g, ""); //remove if u want links in your table
tab_text = tab_text.replace(/<img[^>]*>/gi,""); // remove if u want images in your table
tab_text = tab_text.replace(/<input[^>]*>|<\/input>/gi, ""); // reomves input params
// console.log(tab_text); // aktivate so see the result (press F12 in browser)
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
// if Internet Explorer
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {
txtArea1.document.open("txt/html","replace");
txtArea1.document.write(tab_text);
txtArea1.document.close();
txtArea1.focus();
sa = txtArea1.document.execCommand("SaveAs", true, "DataTableExport.xls");
}
else // other browser not tested on IE 11
sa = window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));
return (sa);
}
问题在于,如果passwordTextField返回“hello”,我会回到钥匙串“xhell”中。 x是随机的..
我认为这是一个基本问题,但我无法想出如何解决它..
答案 0 :(得分:2)
Keychain不是将密码存储为字符串,而是存储字节和字节数的集合。假设您的StorePasswordKeychain
是this Apple document中给出的示例函数的自定义(包含您的应用程序详细信息)版本,那么它只是一个简单的SecKeychainAddGenericPassword
包装器,它只需要指向字节的指针和字节数。
要将NSString
转换为字节,可以使用方法UTF8String
将其转换为C样式字符串,然后使用C函数strlen
计算字节数。 / p>
const char *passwordBytes = [password UTF8String];
StorePasswordKeychain(passwordBytes, strlen(passwordBytes));
重要提示:字节数可能大于Objective-C字符串中的字符数,因为Unicode字符可能需要超过1个字节才能以UTF8格式进行编码。所以不传递字符数(使用length
方法),或者您将拥有看似有效的代码但有一个微妙的错误。
HTH
答案 1 :(得分:-1)
你不应该假设NSString
对象如何存储它的内部表示。在您的情况下,第一个字节可能占用字符串长度或其他NSString
内部数据。请改用以下代码:
NSString *password = [passwordTextField stringValue];
void *mypassword = (void *)[password UTF8String];
StorePasswordKeychain(mypassword, strlen(mypassword));
如果您需要不同的编码,请使用cStringUsingEncoding:
方法代替UTF8String
。