使用NSString *移位值和void *

时间:2016-03-16 12:55:02

标签: objective-c nsstring keychain

我想从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是随机的..

我认为这是一个基本问题,但我无法想出如何解决它..

2 个答案:

答案 0 :(得分:2)

Keychain不是将密码存储为字符串,而是存储字节和字节数的集合。假设您的StorePasswordKeychainthis 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