Tôi đang cố gắng truyền các chuỗi được mã hóa dài qua mạng và khiến chúng xuất hiện chính xác trên máy chủ. Ví dụ, tôi có chuỗi mã hóa này trên máy khách:NSCharacterSet URLHostAllowedCharacterSet không thay thế dấu '+'?
wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR/sBTES1A4rPV6eyp9nzEEU9uKkiFSTdP + SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk + VlpR41kETmznXa4 + gELmf53r7oayRkkffnIPDmpO + WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW/sw ==
Như bạn thấy, nó có một vài ký tự sẽ không truyền qua mạng mà không có mã hóa URL nào đó (+
và /
, đáng chú ý nhất). Tôi không hoàn toàn chắc chắn nếu có thể có các nhân vật khác có thể phát sinh trong các tình huống khác, vì vậy tôi muốn đảm bảo rằng giải pháp của tôi là 'phổ quát' chính xác. Tôi đang sử dụng dòng này:
NSString *escapedString = [cipherString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
mà tôi tìm thấy trong đánh giá cao answer.
Tuy nhiên, tôi vẫn gặp khó khăn trong việc giải mã này ở phía máy chủ, vì vậy tôi in ra kết quả trên máy khách ngay lập tức trước khi gửi, và tôi thấy điều này:
wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR% 2FsBTES1A4rPV6eyp9nzEEU9uKkiFSTdP + SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk + VlpR41kETmznXa4 + gELmf53r7oayRkkffnIPDmpO + WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW% 2Fsw ==
Tại sao các '+' dấu hiệu vẫn còn? Tôi có sử dụng sai ký tự được cho phép không? Tôi nên sử dụng bộ ký tự nào để đảm bảo rằng tôi đã thoát đúng tất cả các ký tự có vấn đề?
Nếu được, đây là mã tôi đang sử dụng để mã hóa chuỗi văn bản thuần túy. Khi nó được thực hiện, tôi base64 mã hóa các kết quả trước khi gửi qua mạng:
- (NSData *)phpEncryptCleartext : (NSData *)cleartext
{
NSData *cleartextPadded = [self phpPadData:cleartext];
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *cipherTextData = [NSMutableData dataWithLength:cleartextPadded.length];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
0,
_sessionKey.bytes,
kCCKeySizeAES128,
_iv.bytes,
cleartextPadded.bytes,
cleartextPadded.length,
cipherTextData.mutableBytes,
cipherTextData.length,
&cryptBytes);
if (ccStatus == kCCSuccess) {
cipherTextData.length = cryptBytes;
}
else {
NSLog(@"kEncryptionError code: %d", ccStatus); // Add error handling
cipherTextData = nil;
}
return cipherTextData;
}
Cảm ơn lời khuyên nào!
tôi đã không kiểm tra docu nhưng nếu nếu không thoát khỏi '+' (mà từ POV của tôi sẽ là ok), bạn có thể bắn lên của bạn thay thế chuỗi riêng thay đổi cộng với biểu tượng dấu và ký hiệu tương đương. –
Có lẽ bạn nên thử 'URLFragmentAllowedCharacterSet'? –
'URLFragmentAllowedCharacterSet' đã tạo ra các sự cố khác. Tôi có thể dễ dàng thay thế dây chuyền của riêng mình, nhưng tôi lo ngại về việc dập tắt đám cháy khi chúng phát sinh, vì vậy tôi không thể hoàn toàn tự tin rằng tôi đã thấy tất cả các nhân vật có vấn đề. Tôi giả định rằng điều này đã được xử lý nhiều lần trước đây, và tôi hy vọng rằng có một phương pháp được xây dựng trong đó sẽ xử lý nó một cách đáng tin cậy. Bây giờ, mặc dù, tôi có lẽ sẽ phải xử lý nó như bạn đề nghị. Cảm ơn! – Alex