user-0 提问: uint8_t *和char*的相互转换 以及 uint8_t  *  和int16_t*的相互转换

回复:
user: user-1
content: 那是16bit uint8_t * p3; p3 = (uint16_t *)p; 我访存的时候 就是按无符号16bit拿出值 *p3 就是我拿出的值 0x11ff吧 我可能算错了 但是就是这个意思

user: user-1
content: 引用 11 楼 neuredfox 的回复:“是访存时候 我怎么去看 ”这是什么意思呢，亲 就是 我有一段空间 就是一个数组 假如 int a = 0x111111ff; 16进制 int * p = a; 这个指针p保存的是a的地址对吧  *p 的值就是0x111111ff吧 拿出4个字节  之后我就玩转换了 uint8_t * p2; p2 = (uint8_t *)p; 我访存的时候 就是按无符号8bit拿出值 *p2 就是我拿出的值 0xff吧  uint8_t * p3; p3 = (uint16_t *)p; 我访存的时候 就是按无符号8bit拿出值 *p3 就是我拿出的值 0x11ff吧 我可能算错了 但是就是这个意思

user: user-0
content: “是访存时候 我怎么去看 ”这是什么意思呢，亲

user: user-1
content: 比如一段 内存区域 我想   1字节     uint8_t *  就是取前1个字节的看做无符号8bit数   2字节     uint16_t * 就是取前2个字节的看做无符号8bit数   4字节     uint32_t * 就是取前4个字节的看做无符号8bit数   8字节     uint64_t * 就是取前8个字节的看做无符号8bit数  这个是指针 是访存时候 我怎么去看  不会有溢出和符号任何问题

user: user-1
content: 可以随便转换  我才看出来 原来我错了 那个是指针啊uint8_t *和char*的相互转换 以及 uint8_t * 和int16_t* 我说的是如果是类型就不可以随便强转了  他们操作的是地址  随便转没问题

user: user-0
content: 可是，在调用一个别的库的时候， len1 = avcodec_decode_audio3(codecContext,audio_buf1,&data_size,pkt_temp);  这里的audio_buf1，不是一个int16_t*的类型么？这个难道不会溢出？ 我刚开始的代码是不转换的， ESPkt->data = audio_buf1;编译器会报错  error: cannot convert 'int16_t*' to 'uint8_t*' in assignment

user: user-1
content: 你那个结构体这么定义uint8_t       *data; //!< AV packet data pointer   说明这个包最大返回也不会超过无符号8个字节  所以你转换的时候 不会 溢出 也不会有符号问题 但还是不建议这么来做 这不是在考验人的智商吗

user: user-0
content: 可是最终的class ESPacket {  public:   explicit ESPacket();   ~ESPacket();   bool          IsEOS() { return is_EOS_; }   void          SetEOS(bool eos) { is_EOS_ = eos; size = 1024;}   int32_t       GetSize();   void          *private_data; //!< private data pointer which may be used by data reader   uint32_t      sequence_header_size; //!< sequence header size if need   uint8_t       *sequence_header_data; //!< sequence header data pointer if size > 0   uint32_t      frame_header_size; //!< frame header size if need   uint8_t       *frame_header_data; //!< frame header data pointer if size > 0   uint32_t      frame_header_need_free; //!< if the frame header data need be freed every time   uint8_t       seqheader_need_free; //!< if need free sequence_header_data every time    uint8_t       *data; //!< AV packet data pointer   //int16_t       *data; //!< AV packet data pointer   int32_t       size; //!< AV packet size   uint32_t      index; //!< Stream index of the packet   TimeStamp     pts;   uint32_t      is_i_frame; //!< Flag of I frame(for video only)    typedef enum {     ES_TYPE_INVALID = 0x100,     ES_TYPE_VIDEO,     ES_TYPE_AUDIO,     ES_TYPE_SUB,   } ES_TYPE;   ES_TYPE       GetType() { return type_; }   void          SetType(ES_TYPE type) { type_ = type; }   private:   bool          is_EOS_;   ES_TYPE       type_; };  这个库里面必须用  uint8_t       *data; //!< AV packet data pointer  这个要怎么弄。。。。被搞晕了几天了。

user: user-1
content: 引用 3 楼 neuredfox 的回复:[quote=引用 1 楼 u011779875 的回复:] uint8_t,int16_t一般是指无符号8bit整型数和有符号16bit整形数，C语言无此类型，自己定义 如： typedef unsigned char uint8_t; 于char类型只相差一个符号，一般可以直接转换： char* a = (char*)b; uint8_t* b = (uint8_t*)a;    还有C语言有一个标准库叫 <stdint.h> stdint.h是c99中引进的一个标准C库的头文件. 二、干什么 C99中，<stdint.h>中定义了几种扩展的整数类型和宏。  那请问 uint8_t *a; int16_t* b; a = (uint *)b; 这样是否可行呢，谢谢。[/quote] 如果都是正的没问题吧 应该你最好用uint16_t* audio_buf1;

user: user-1
content: uint8_t  无符号8bit整型数 int16_t  有符号16bit整形数 个人意见 我不敢保证 仅供参考 没问题吧 就比如 char c = 2; int tmd; tmd = (int )c;  或者 int c = 444; char tmd; tmd = (char)c; 大了向小的转换没问题 小的向大的转换有问题 无符号向有符号之间的转换要小心

user: user-0
content: 引用 1 楼 u011779875 的回复:uint8_t,int16_t一般是指无符号8bit整型数和有符号16bit整形数，C语言无此类型，自己定义 如： typedef unsigned char uint8_t; 于char类型只相差一个符号，一般可以直接转换： char* a = (char*)b; uint8_t* b = (uint8_t*)a;    还有C语言有一个标准库叫 <stdint.h> stdint.h是c99中引进的一个标准C库的头文件. 二、干什么 C99中，<stdint.h>中定义了几种扩展的整数类型和宏。  那请问 uint8_t *a; int16_t* b; a = (uint *)b; 这样是否可行呢，谢谢。

user: user-0
content: 我在使用ffmpeg的库做ape的软解码， 其中 ESPacket* ESPkt = new ESPacket;  这个结构中的 一个成员是： uint8_t       *data; //!< AV packet data pointer 而我调用的 len1 = avcodec_decode_audio3(codecContext,audio_buf1,&data_size,pkt_temp); 使用了一个 int16_t* audio_buf1; 最后的回调前，赋值 ESPkt->data = (uint8_t  *)audio_buf1;  这样会不会有问题呀，各位大哥么。

user: user-1
content: uint8_t,int16_t一般是指无符号8bit整型数和有符号16bit整形数，C语言无此类型，自己定义 如： typedef unsigned char uint8_t; 于char类型只相差一个符号，一般可以直接转换： char* a = (char*)b; uint8_t* b = (uint8_t*)a;    还有C语言有一个标准库叫 <stdint.h> stdint.h是c99中引进的一个标准C库的头文件. 二、干什么 C99中，<stdint.h>中定义了几种扩展的整数类型和宏。