美文网首页
关于Android和iOS兼容的那一点点小事

关于Android和iOS兼容的那一点点小事

作者: 不辣先生 | 来源:发表于2019-01-25 11:03 被阅读15次

1.首先讲讲在加密时候遇到的问题,缘起:公司的前后端交互涉及到加密,加密策略是aes+rsa,我们后台竟然用了一套Android前端开发发给他的代码,因为后端也是Java,后面我接入的时候贼鸡儿坑,根本玩不通,这里我要diss一下那个sb后端开发,一问三不知:不知代码,不懂加密策略,不懂考虑兼容,竟然用前端Android发的代码,脑子瓦特了吧,完全不考虑其他端的兼容性,问题就 产生在Android Java jdk自带的那个产生随机key的方法,Android和后端都用那一套,而我得仿写那个产生随机key的方法,得知道那个方法是怎么处理字符串的,what fuck!一问Android和后端开发,他们也说不出来,那我咋整,整tm,让那个sb后端重新考虑策略,后端加了一个端的判断,整了俩套逻辑区分请求来自iOS还是Android,这个肯定是不可取得;
重点就是结论:加解密的Android不要用那个jdk自带的产生随机key的方法(听说随机key并不会增加加密的安全性),不然大家就只能各玩各的,然后在这种问题上一定要考虑兼容性,否则就是浪费大家的时间;
2.这个也是涉及到前端兼容问题,缘起:也是一个sb后端直接用Android的代码,因为我们开发进度是由需求推动的,Android那边需求走在前头;这次的问题是关于文件读写的;
txt文本读写方式,两个端兼容没啥问题,但是文本读写效率不如二进制读写;
二进制读写有个根本问题就是字节流的操作,一定要考虑大小端问题,iOS默认输出是小端(这个自行百度怎么用代码判断),Android有个bytebuffer的东东默认输出的是大端,顺便说说,网络、socket也是大端,大端序又被称作网络字节序;so,在两个端文本互通环节,如果没考虑这个那就是整到头发都没了也整不出来,贼鸡儿坑的是,Android开发不知道有大小端这回事,后端也没这个考虑,what fuck,我是各种找资料,无意中发现了这个bytebuffer是大端序才明白的;
关于文件读写效率,在语言上的 表现: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))) { //一直读到文件结束
        //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; //打开文件失败则结束运行
    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)
{
    //写出数据
    ofstream f(path,ios::binary);
    if(!f)
    {
        cout << "创建文件失败" <<endl;
        return;
    }
    f.write((char*)&s[0], sizeof(float)*256);      //fwrite以char *的方式进行写出,做一个转化
    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的数组进行二进制bin文件的读写,大小端的转换都是基于float类型的,仅供参考;
因为我这边都是大批量的二进制小文件(大概有2万个1kb文件),一直困于效率问题,如有大神看到请支个招
Android有个filechannel类处理很高效,而iOS我没找到类似的高效处理io流的方法或者类

相关文章

网友评论

      本文标题:关于Android和iOS兼容的那一点点小事

      本文链接:https://www.haomeiwen.com/subject/ywcmjqtx.html