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流的方法或者类
网友评论