uint8_t *和char*的相互转换 以及 uint8_t * 和int16_t*的相互转换

neuredfox 2013-10-23 02:58:51
这个怎么弄啊 我才学C语言,谢谢。
...全文
24397 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
做或不做 2013-10-23
  • 打赏
  • 举报
回复
那是16bit uint8_t * p3; p3 = (uint16_t *)p; 我访存的时候 就是按无符号16bit拿出值 *p3 就是我拿出的值 0x11ff吧 我可能算错了 但是就是这个意思
做或不做 2013-10-23
  • 打赏
  • 举报
回复
引用 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吧 我可能算错了 但是就是这个意思
neuredfox 2013-10-23
  • 打赏
  • 举报
回复
“是访存时候 我怎么去看 ”这是什么意思呢,亲
做或不做 2013-10-23
  • 打赏
  • 举报
回复
比如一段 内存区域 我想 1字节 uint8_t * 就是取前1个字节的看做无符号8bit数 2字节 uint16_t * 就是取前2个字节的看做无符号8bit数 4字节 uint32_t * 就是取前4个字节的看做无符号8bit数 8字节 uint64_t * 就是取前8个字节的看做无符号8bit数 这个是指针 是访存时候 我怎么去看 不会有溢出和符号任何问题
做或不做 2013-10-23
  • 打赏
  • 举报
回复
可以随便转换 我才看出来 原来我错了 那个是指针啊uint8_t *和char*的相互转换 以及 uint8_t * 和int16_t* 我说的是如果是类型就不可以随便强转了 他们操作的是地址 随便转没问题
neuredfox 2013-10-23
  • 打赏
  • 举报
回复
可是,在调用一个别的库的时候,
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
做或不做 2013-10-23
  • 打赏
  • 举报
回复
你那个结构体这么定义uint8_t *data; //!< AV packet data pointer 说明这个包最大返回也不会超过无符号8个字节 所以你转换的时候 不会 溢出 也不会有符号问题 但还是不建议这么来做 这不是在考验人的智商吗
neuredfox 2013-10-23
  • 打赏
  • 举报
回复
可是最终的
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
这个要怎么弄。。。。被搞晕了几天了。
做或不做 2013-10-23
  • 打赏
  • 举报
回复
引用 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;
做或不做 2013-10-23
  • 打赏
  • 举报
回复
uint8_t 无符号8bit整型数 int16_t 有符号16bit整形数 个人意见 我不敢保证 仅供参考 没问题吧 就比如 char c = 2; int tmd; tmd = (int )c; 或者 int c = 444; char tmd; tmd = (char)c; 大了向小的转换没问题 小的向大的转换有问题 无符号向有符号之间的转换要小心
neuredfox 2013-10-23
  • 打赏
  • 举报
回复
引用 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;
这样是否可行呢,谢谢。
neuredfox 2013-10-23
  • 打赏
  • 举报
回复
我在使用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;
这样会不会有问题呀,各位大哥么。
做或不做 2013-10-23
  • 打赏
  • 举报
回复
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>中定义了几种扩展的整数类型和宏。
# IEC104 Protocol of IEC104 and IEC101 ## by chendajie 2014-2015 ## 电网IEC104/IEC101通信协议 ============================== 隔离协议内容与平台或者硬件相关性,已经在stm32平台和linux平台移植测试通过,可轻松移植到其他平台。 ============================================================================ 队列实现的隔离,目前实现简单的先入先出队列,可根据需求用其他队列算法替换。 移植调用实现: 1.在不同平台下,实现_iec10x结构体的函数指针(利用函数指针实现的接口)。 2.调用RegisterIEC10XMoudle,注册实现的_iec10x接口。 3.创建线程一调用Iex104_Receive管理收包解析。 4.创建线程二调用Iec10x_Scheduled实现出队调度。 5.创建线程三实现状态机Iec104_StateMachine,实现协议状态管理,协议包组包入队。 代码内容 IEC0x目录 iec101.c iec101协议包内容 iec104.c iec104协议包内容 iec10x.c 队列初始化,入队出对实现,队列优先级等相关实现,队列调度实现 PRIO_QUEUE_Iec10x.c 队列具体算法实现 test目录 linux上简单测试代码,仅供参考,作者具体协议应用在stm32上,利用状态机控制数据包入队与出队调度 重要函数: Iec10x_Scheduled:出队调度 IEC10X_Enqueue:入队函数 IEC10X_Dequeue:出队函数 IEC10X_FindQHead:查找最高优先级数据包 IEC10X_XXX:前缀为IEC10X_的函数为各个协议包的组包函数 Iec104_StateMachine: 104协议状态机 Iex104_Receive:收包解析 RegisterIEC10XMoudle:协议模块注册,初始化 重要结构体: 用函数指针实现的移植接口,根据不同平台与硬件特性,选择性实现以下接口 typedef struct _iec10x { char * name; int (* Init)(void); void (* Delay_ms)(uint16_t); void (* CloseLink)(void); void *(* Malloc)(uint8_t NumByte); void (* Free)(void *buffer); uint8_t (* enqueue)(Iec10x_PrioQueue_T *QueueHdr, Iec10x_PrioNode_T *NewNode); Iec10x_PrioNode_T *(* dequeue)(Iec10x_PrioQueue_T * QueueHdr); Iec10x_PrioNode_T *(* FindQHead)(Iec10x_PrioQueue_T * QueueHdr); char (* GetPrio)(void); void (* InitQueue)(Iec10x_PrioQueue_T *PrioQueue); void (* ClearQueue)(Iec10x_PrioQueue_T * QueueHdr); uint8_t (* Send)(int socketfd,char *data,int len); uint32_t (* SetTime)(PCP56Time2a_T time); uint32_t (* GetTime)(PCP56Time2a_T time); int8_t (* GetStationState)(uint16_t Addr, uint8_t DevType); float (* GetStaValue)(uint16_t Addr, uint8_t DevType); uint16_t (* GetLinkAddr)(void); int8_t (* GetInfoNum)(uint8_t *InfoNum, uint8_t DevType); int8_t (* SetConfig)(long Value, uint32_t addr); int8_t (* SaveFirmware)(uint8_t FirmLen, uint8_t *buf,uint32_t FirmwareType, uint32_t Iec10x_Update_SeekAddr); int8_t (* CheckFirmware)(uint32_t FirmwareType, uint32_t TotalLen); int8_t (* UpdateFirmware)(uint32_t FirmwareType); int8_t (* BackoffFirmware)(uint32_t FirmwareType); #ifdef IEC10XLOCK void (* LOCK)(void); void (* UNLOCK)(void); #endif } *PIEC10X_T, IEC10X_T;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧