zoukankan      html  css  js  c++  java
  • 气人的iconv

    今天做一个gdk到utf-8的转化,做了一天,都没有出结果,最后偶然的机会才发现原因:

    网上找到的代码:

    int utf8_gbk(char* src,int slen,char* dst,int dlen)
    {
      iconv_t cd;
      cd = iconv_open("utf-8", "gb2312");
      if (cd==0 || cd== (iconv_t)-1)
      return -1;

      memset(dst,0,dlen);
      if (iconv(cd,&src,&slen, &dst,&dlen)==-1){
        iconv_close(cd);
        return -1;
      }


      iconv_close(cd);
      return dlen;

    }

    我的代码:

    //gb2312 -> utf-8, 

    //return:>0转化后得到的长度,<0失败原因

    //point_data:input-需要转化的数据, output-返回转化后的数据

    //data_length: point_data的大小

    int utf8_gbk(char* point_data, int data_length)
    {
      iconv_t cd;
      cd = iconv_open("utf-8", "gb2312");
      if (cd==0 || cd== (iconv_t)-1) 
      return -1;

      int alloc_length   =  data_length * 4;

      char* point_alloc = malloc(alloc_length);

      if (NULL == point_alloc){

        return -2;

      }

      int length = strlen(point_data);

      memset(point_alloc, 0, alloc_length);
      if (iconv(cd, &point_data, &lenth, &point_alloc, &alloc_length)==-1){

        free(point_alloc);

        point_alloc = NULL;


        iconv_close(cd);
        return -1;
      }
      iconv_close(cd);

      memset(point_data, 0, data_length);

      int copy_length = data_length * 4 - alloc_length;

      if (copy_length > data_length) {

        free(point_alloc);

        point_alloc = NULL;

        

        return -3;

      }

      memcpy(point_data, point_alloc, copy_length );

      free(point_alloc);

      point_alloc = NULL;

      return copy_length ;

    }

    原来准备只写带两个参数的函数, 一个地址,即是输入,又是输入,一个大小限制, 在函数最后把结果拷贝到参数地址中!

    但是无论怎么测试,都得不出结果,

    最后发现:iconv把地址给point_data的地址改为数据内容后面的地址了,

        把point_alloc改为填充后的地址了!

    最后导致 无论怎么样都无法获取到数据!

    对于最上面从网络上copy的代码,虽然地址改变了, 但是源数据还是没有变,而且数据也填充到地址空间里面了!!!!

  • 相关阅读:
    IDA 动态调试 ELF 文件
    双机调试环境搭建[win7+Windbg+VirtualKD]
    从域环境搭建到 MS14-068 提升为域权限
    栈溢出原理与 shellcode 开发
    Flask_0x05 大型程序结构
    rest-framework 框架的基本组件
    restful 规范
    Django的CBV和FBV
    Django-model 进阶
    Django-Ajax
  • 原文地址:https://www.cnblogs.com/zqhiuui/p/3838361.html
Copyright © 2011-2022 走看看