關于Android和iOS兼容的那一點點小事

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流的方法或者類

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容