js和Object-c中sha1中文出错

本文介绍了解决JS与Objective-C在处理中文字符串进行SHA1加密时出现的数据丢失问题。针对JS,通过将UTF-16编码转换为UTF-8编码来解决;而Objective-C则通过直接使用NSData的dataUsingEncoding方法来处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js如何修改

由于js在内部编码上对中文是utf16于是在调用sha1方法前面加上转换字符

utf16转utf8

function utf16to8(str)  {
    var out, i, len, c;
 
    out = "";
    len = str.length;
    for(i = 0; i < len; i++){
        c = str.charCodeAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
        } else if (c > 0x07FF){
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        } else {
            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        }
    }
    return out;
}


Object-c如何修改

某第三方库代码

const char *cstr = [self cStringUsingEncoding:encoding];
NSData *data = [NSData dataWithBytes:cstr length:self.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 
CC_SHA1(data.bytes, data.length, digest);  
NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];   
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x", digest[i]];
}
return result.uppercaseString;

上面的方法中文字符串转data时会造成数据丢失,把

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];  
NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

这两句改成

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];

就可以了

ps,这是因为我们遇到字符串先转成utf-8了,而后台遇到没转utf8,而是直接sha1加密。



PS C:\Users\万鑫\Desktop\hello> node .\index.js 连接失败:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Sequence._packetToError (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:518:28) at addChunk (node:internal/streams/readable:561:12) -------------------- at Protocol._enqueue (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\protocol\Protocol.js:51:23) at Connection.connect (C:\Users\万鑫\Desktop\hello\node_modules\mysql\lib\Connection.js:116:18) at Object.<anonymous> (C:\Users\万鑫\Desktop\hello\index.js:10:12) at Module._compile (node:internal/modules/cjs/loader:1730:14) at Object..js (node:internal/modules/cjs/loader:1895:10) at Module.load (node:internal/modules/cjs/loader:1465:32) at Function._load (node:internal/modules/cjs/loader:1282:12) at TracingChannel.traceSync (node:diagnostics_channel:322:14) at wrapModuleLoad (node:internal/modules/cjs/loader:235:24) 查询出错:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
最新发布
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二蛋和他的大花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值