最近在做一个项目,项目请求信息是以报文格式来发送的。并且信息还要以BCD压缩请问下在objective-c中,BCD压缩的方法怎么写呀,求大侠帮忙!急!
   

解决方案 »

  1.   


    压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字。如:56的压缩型8421   BCD码是0101   0110;  换句话说,这个过程不复杂,将数的各位的数字获取到,转换成二进制形式。
      

  2.   

       谢谢cxsjabcabc的帮助! 
       但是将数的各位数字获取到,转为二进制后,各个数字变成了8字节。问题是怎样让其中的两个数字(共16字节)压缩后,总共变成8个字节   这个方法怎么写    我是一个新手! 求大侠帮忙!
      

  3.   

    我在网上找了一个BCD压缩的案例
    压缩的方法是:
          public static byte[] ascii2hex(byte[] bs) {
            byte[] res = new byte[bs.length / 2];
           System.out.println("--start--");
            for (int i = 0, n = bs.length; i < n; i += 2) {
                res[i / 2] = (byte) (Integer.parseInt(new String(bs, i, 2), 16));
               
            }
            
            return res;
        }//多个字节数组转成一个字节数组
    public static byte[] sendbaowen(List list) {
    Iterator it = list.iterator();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while (it.hasNext()) {
    try {
    bos.write((byte[]) it.next());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    byte[] nn = bos.toByteArray();
    return nn;
    }

    它是这样完成的
    List list=new ArrayList();
    byte[] a1= ascii2hex("00".getBytes());
    byte[] a2= ascii2hex("01".getBytes());
    byte[] a3= ascii2hex("02".getBytes());
    list.add(a1);
    list.add(a2);
    list.add(a3);
    byte baowen1[]=sendbaowen(list1);//多个字节数组转成一个字节数组
    String uploadData = new String(baowen1, "ISO-8859-1");
    然后将uploadData用socket发送
    ---------------------------------------------------------------
    我通过调试
    发现ascii2hex方法实际上就是将 一个两位数字转为十六进制 然后用getBytes()
    sendbaowen  就是将多个字节数组转成一个字节数组 罢了so写了如下的方法:
    //数据压缩   实际上将dataStr的  每两位数字 转为16进制
    -(NSData *)ascii2hex:(NSString *)dataStr
    {
    int len=[dataStr length];
    if(len%2==1){   NSLog(@"转换的数据长度必须为偶数");return nil; }
    NSMutableString * changeStr=[[NSMutableString alloc] initWithCapacity:50];

    for(int i=0;i<len;i++)
    {
    NSAutoreleasePool *pool=[NSAutoreleasePool new];
    NSString *temps1=[dataStr substringWithRange:NSMakeRange(i,1)];    
    int temp1=[temps1  intValue];//两位数字中的第一位数字
    i++;

    NSString *temps2=[dataStr substringWithRange:NSMakeRange(i,1)];    
    int temp2=[ temps2 intValue];//两位数字中的第二位数字
    int temp=temp1 *16+temp2;
    [changeStr appendFormat:@"%d",temp];
    [pool release];
    }
    NSData *retData=[changeStr dataUsingEncoding:NSISOLatin1StringEncoding];
    [changeStr release];
    return retData;
    }NSData *channelNum=[self ascii2hex:@"00"];
    NSData *shopNum=       [self ascii2hex:@"01"];
    NSData *accountType=[self ascii2hex:@"02"];
    [channelNum appendData:shopNum];
    [channelNum appendData:accountType];  
    然后将channelNum用NSISOLatin1StringEncoding编码后通过AsyncSocket发送到服务器上的求大侠看看  代码哪儿有问题  求大侠帮忙!感激不尽!