1.首先講講在加密時候遇到的問題,緣起:公司的前后端交互涉及到加密,加密策略是aes+rsa,我們后臺竟然用了一套Android前端開發(fā)發(fā)給他的代碼,因為后端也是Java,后面我接入的時候賊雞兒坑,根本玩不通,這里我要diss一下那個sb后端開發(fā),一問三不知:不知代碼,不懂加密策略,不懂考慮兼容,竟然用前端Android發(fā)的代碼,腦子瓦特了吧,完全不考慮其他端的兼容性,問題就 產(chǎn)生在Android Java jdk自帶的那個產(chǎn)生隨機key的方法,Android和后端都用那一套,而我得仿寫那個產(chǎn)生隨機key的方法,得知道那個方法是怎么處理字符串的,what fuck!一問Android和后端開發(fā),他們也說不出來,那我咋整,整tm,讓那個sb后端重新考慮策略,后端加了一個端的判斷,整了倆套邏輯區(qū)分請求來自iOS還是Android,這個肯定是不可取得;
重點就是結(jié)論:加解密的Android不要用那個jdk自帶的產(chǎn)生隨機key的方法(聽說隨機key并不會增加加密的安全性),不然大家就只能各玩各的,然后在這種問題上一定要考慮兼容性,否則就是浪費大家的時間;
2.這個也是涉及到前端兼容問題,緣起:也是一個sb后端直接用Android的代碼,因為我們開發(fā)進度是由需求推動的,Android那邊需求走在前頭;這次的問題是關于文件讀寫的;
txt文本讀寫方式,兩個端兼容沒啥問題,但是文本讀寫效率不如二進制讀寫;
二進制讀寫有個根本問題就是字節(jié)流的操作,一定要考慮大小端問題,iOS默認輸出是小端(這個自行百度怎么用代碼判斷),Android有個bytebuffer的東東默認輸出的是大端,順便說說,網(wǎng)絡、socket也是大端,大端序又被稱作網(wǎng)絡字節(jié)序;so,在兩個端文本互通環(huán)節(jié),如果沒考慮這個那就是整到頭發(fā)都沒了也整不出來,賊雞兒坑的是,Android開發(fā)不知道有大小端這回事,后端也沒這個考慮,what fuck,我是各種找資料,無意中發(fā)現(xiàn)了這個bytebuffer是大端序才明白的;
注意:內(nèi)存地址分配規(guī)則
關于文件讀寫效率,在語言上的 表現(xiàn):c>C++>oc;
上代碼
- (NSArray *)OCreadInBigWithPath:(NSString *)path{
// NSData *data = [NSData dataWithContentsOfFile:path];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
if (fileHandle == nil){
return nil;
}
NSData *data = [fileHandle readDataToEndOfFile];
// float temp[256];
NSMutableArray *M_arr = [NSMutableArray array];
for (int i = 0; i < 256; i ++) {
char a[4];
char b[4];
[data getBytes:&a[0] range:NSMakeRange(i*4, 4)];
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
float value;
memcpy(&value, b, sizeof(b));
[M_arr addObject:[NSNumber numberWithFloat:value]];
}
[fileHandle closeFile];
return M_arr.copy;
}
- (NSArray *)OCreadInLittleWithPath:(NSString *)path {
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
if (fileHandle == nil){
return nil;
}
NSData *data = [fileHandle readDataToEndOfFile];
float s[256];
[data getBytes:&s[0] length:sizeof(s)];
NSMutableArray *m_arr = [NSMutableArray array];
for (int i = 0; i < 256; i ++) {
NSNumber *temp = [NSNumber numberWithFloat:s[i]];
[m_arr addObject:temp];
}
[fileHandle closeFile];
return m_arr.copy;
}
- (void)OCwriteInLittleWithPath:(NSString *)path floatArr:(float *)floatArr{
NSMutableData *m_data = [NSMutableData data];
[m_data appendBytes:&floatArr[0] length:sizeof(floatArr)];
[m_data.copy writeToFile:path atomically:NO];
}
- (BOOL)OCwriteInBigWithPath:(NSString *)path content:(NSArray *)features{
NSMutableData *m_data = [NSMutableData data];
for (int i = 0; i <features.count; i ++) {
float temp = [features[i] floatValue];
char a[4];
char b[4];
memcpy(&a[0], &temp, sizeof(temp));
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
[m_data appendBytes:&b[0] length:sizeof(temp)];
}
return [m_data.copy writeToFile:path atomically:YES];
}
void WriteBINFile_C(const char *path,float *contentArr)
{
FILE* fp = fopen(path,"wb");
if (fp == NULL){
return;
}
for (int i = 0; i < 256; i++)
{
float buffer = contentArr[i];
char a[4];
char b[4];
memcpy(&a[0], &buffer, sizeof(buffer));
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
fwrite((char*)&b[0], sizeof(buffer), 1, fp);
}
fclose(fp);
}
NSArray * CReadBINFile_InBig(const char *path)
{
FILE* fp = fopen(path,"rt");
if(fp == NULL){
return nil;
}
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 256; i++) {
char a[4];
char b[4];
fread(&a[0], sizeof(a), 1, fp);
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
float value;
memcpy(&value, b, sizeof(b));
// contentArr[i] = value;
[arr addObject:[NSNumber numberWithFloat:value]];
}
fclose(fp);
return arr.copy;
}
void CReadBINFile_InLittel(const char *path,float *floatarr){
FILE* fp = fopen(path,"rb");
if(fp == NULL){
return ;
}
fread(&floatarr[0], 1024, 1, fp);
fclose(fp);
}
void CWriteBINFile_inLitle(const char *path,float *contentArr)
{
FILE* fp = fopen(path,"wb");
if (fp == NULL){
return;
}
fwrite((char*)&contentArr[0], sizeof(float)*256, 1, fp);
fclose(fp);
}
c++的是單獨的文件集成的
#include "reader.hpp"
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
int readTool::readBin(const char *path,float *s)
{
std::ifstream inFile(path, ios::in | ios::binary); //二進制讀方式打開
if (!inFile) {
cout << "error" << endl;
return -1;
}
int i = 0;
char a[4];
char b[4];
while(inFile.read(a, sizeof(a)))
{
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
float value;
memcpy(&value, b, sizeof(b));
// cout<<value<<endl;
s[i] = value;
i ++;
}
// while (inFile.read(( char *)&s[i], sizeof(float))) { //一直讀到文件結(jié)束
//cout << readedBytes << endl;
// i++;
// }
// cout << i << endl;
inFile.close();
return 0;
}
void readTool::writeFile(const char *path,float *s){
ofstream ofs;
ofs.open(path, ios::out | ios::app | ios::binary); //輸出到文件 ,追加的方式,二進制。 可同時用其他的工具打開此文件
if (!ofs.is_open())return; //打開文件失敗則結(jié)束運行
for (int i = 0; i < 256; i++)
{
float buffer = s[i];
char a[4];
char b[4];
memcpy(&a[0], &buffer, sizeof(buffer));
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
ofs.write((char*)&b[0], sizeof(buffer));
ofs.flush();
}
ofs.close();
}
//采用CPP模式寫二進制文件
void readTool:: DataWrite_CPPMode(const char *path,float *s)
{
//寫出數(shù)據(jù)
ofstream f(path,ios::binary);
if(!f)
{
cout << "創(chuàng)建文件失敗" <<endl;
return;
}
f.write((char*)&s[0], sizeof(float)*256); //fwrite以char *的方式進行寫出,做一個轉(zhuǎn)化
f.close();
}
//采用CPP模式讀二進制文件
void readTool:: DataRead_CPPMode(const char *path,float *s)
{
ifstream f(path, ios::binary);
if(!f)
{
cout << "讀取文件失敗" <<endl;
return;
}
f.read((char*)&s[0],sizeof(float)*256);
f.close();
}
我這邊的需求是把float的數(shù)組進行二進制bin文件的讀寫,大小端的轉(zhuǎn)換都是基于float類型的,僅供參考;
因為我這邊都是大批量的二進制小文件(大概有2萬個1kb文件),一直困于效率問題,如有大神看到請支個招
Android有個filechannel類處理很高效,而iOS我沒找到類似的高效處理io流的方法或者類