摘要: [译]Flutter JSON和序列化 很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据。制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON。 本指南介绍了如何在Flutter中使用JSON。它涵盖了在不同场景中使用哪种JSON解决方案,以及原因。 哪种JSON序 阅读全文
posted @ 2018-11-28 20:52 Nonato 阅读(2616) 评论(0) 推荐(0) 编辑

  最近用socket发送data遇到个问题,字节高地位和服务器不匹配,搞了好久才找到解决的方案,主要用到两个函数HTOL HTOS STOH LTOL 故写此博文

什么是字节序

采用维基百科的解释如下:

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。

例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23,..。而小端法将是:0x100: 67, 0x101: 45,..

 

相关体系

  • x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。

  • Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian

  • ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。

  • 网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。伯克利socket API定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。

-(NSMutableData *)DataForAuthreq
{
    NSMutableData * senddata = [NSMutableData new];
    NSMutableData * contentdata = [NSMutableData new];
    NSString * uKey = @"nonato";
    NSString * uSecret = @"nonatopassword";
    uint16_t  uklength = 0xff & uKey.length; //strlen(uKey);
    HTONS(uklength);//转换
    [contentdata appendBytes:&uklength  length:sizeof(uklength)];
    [contentdata appendData:[uKey dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]];
    uint16_t  uSlength = 0xff &  uSecret.length; //strlen(uSecret);
    HTONS(uSlength);//转换
    [contentdata appendBytes:&uSlength  length:sizeof(uSlength)];
    [contentdata appendData:[uSecret dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]];
  
    uint32_t contentdatalength = 0xffff & (contentdata.length + 4);
    HTONL(contentdatalength);//转换
    [senddata appendBytes:&contentdatalength length:sizeof(4)];
    uint32_t ProtocolId = 0xffff & 0x1002;
    HTONL(ProtocolId);//32字节转换成网络顺序
    [senddata appendBytes:&ProtocolId length:sizeof(4)];
    [senddata appendData:contentdata];
      
    return senddata;
}

 

 

if (NSHostByteOrder() == NS_LittleEndian) {
        NSLog(@"LittleEndian");
    }
    else if(NSHostByteOrder() == NS_BigEndian){
         NSLog(@"BigEndian");
    }
    else {
         NSLog(@"Unknow");
    }

 

通过上述代码打印出来的log,可以知道iOS系统目前采用的是小端序。因此在进行socket网络传输之类的工作时,要记得先把字节序进行转换,然后再传输。iOS自身提供了相应的转换方法,如下:

1
2
3
UInt16  Byte = 0x1234;
HTONS(Byte);//转换
NSLog(@"Byte == %x",Byte);//打印出来发现顺序变了

上述代码中 HTONS(x) 是对2字节进行转换,如果要对4字节进行转换,就要用 HTONL(x)进行转换了,要对更高字节,比如8字节(64位)进行转换,就要自己写转换的方法了。

参考资料

  1. 关于字节序;

  2. Mac&iOS Socket;

  3. 网络字节序与主机字节序 高低位;

  4. 字节序;

  5. Byte Ordering;

posted @ 2015-10-26 09:47 Nonato 阅读(3275) 评论(1) 推荐(1) 编辑
摘要: 可选类型《Swift权威指南》第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍。尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Swift程序都必不可少的。所以,读者通过对本章学习,可以使用Swift编写最基本的程序,并对Swift提供的新特性深... 阅读全文
posted @ 2015-10-13 16:49 Nonato 阅读(1850) 评论(0) 推荐(0) 编辑
摘要: 以forkingdog的PorotocolKit举例举例ProtocolKitProtocol extension for Objective-CUsageYour protocol:@protocol Forkable @optional- (void)fork;@required- (NSStr... 阅读全文
posted @ 2015-10-13 12:32 Nonato 阅读(1184) 评论(0) 推荐(0) 编辑
摘要: 在写OC的时候需要用 NSClassFromString(classStringName)获得一个类,如果存在就用这个类型来声明一个对象,但是在swift的时候却往往得不到这个类,为什么呢?从截图看分析swift里面的对象还有该工程的名字CFBundleName所以我们可以分析出只要加上该工程的名字... 阅读全文
posted @ 2015-10-12 10:10 Nonato 阅读(1872) 评论(0) 推荐(0) 编辑
摘要: Cocoa框架早已烙上了不可磨灭的OC印记,而无数的第三方库都是用OC写成的,这些积累无论是谁都不能小觑。苹果采取了允许开发者在同一个项目中同时使用Swift和OC进行开发的做法,但要想实现互通,又需添加哪些桥梁?虽然说Swift语言的初衷是希望能摆脱Objective-C的沉重的历史包袱和约束,但... 阅读全文
posted @ 2015-10-12 09:53 Nonato 阅读(853) 评论(0) 推荐(0) 编辑
摘要: 中文快速导航:1.iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1)i. WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)ii. WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?Apple是不是又在反人类?)iii. HOW(如何适配?---弱弱地问下:... 阅读全文
posted @ 2015-10-09 09:30 Nonato 阅读(623) 评论(0) 推荐(0) 编辑
摘要: SWIZZLE由王巍 (@ONEVCAT)发布于2015/09/30Swizzle 是 Objective-C 运行时的黑魔法之一。我们可以通过 Swizzle 的手段,在运行时对某些方法的实现进行替换,这是 Objective-C 甚至说 Cocoa 开发中最为华丽,同时也是最为危险的技巧之一。因... 阅读全文
posted @ 2015-10-08 15:23 Nonato 阅读(678) 评论(0) 推荐(0) 编辑
摘要: LAZY 修饰符和 LAZY 方法由王巍 (@ONEVCAT)发布于2015/10/07延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略。另外,有些情况下我们并不会立即用到一个对象的所... 阅读全文
posted @ 2015-10-08 12:10 Nonato 阅读(1224) 评论(0) 推荐(0) 编辑
摘要: Cocoa的依赖管理器,我们已经有了CocoaPods,非常好用,那么为什么还要创建这样一个项目呢?本文翻译自Carthage的Github的README.md,带大家来了解一下这个工具有何不同之处。Carthage的目标是用最简单的方式来管理Cocoa第三方框架。基本的工作流如下:创建一个Cart... 阅读全文
posted @ 2015-09-14 10:17 Nonato 阅读(252) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示