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

neuredfox 2013-10-23 02:58:51
这个怎么弄啊 我才学C语言,谢谢。
...全文
24876 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>中定义了几种扩展的整数类型和宏。
代码下载地址: https://pan.quark.cn/s/b4a8e0160cfc 齿轮与轴系零件在机械设备中扮演着至关重要的角色,它们负责实现动力传输、调整运动形态以及承受工作载荷等核心功能。 在机械工程的设计实践中,齿轮和轴系的设计是一项关键的技术任务,其内容涵盖了材料选用、构造规划、承载能力分析等多个技术层面。 下面将系统性地介绍《齿轮及轴系零件结构设计指导书》中的核心知识点。 一、齿轮设计1. 齿轮种类:依据齿廓轮廓的不同,齿轮可划分为直齿齿轮、斜齿轮以及人字齿轮等类别,各类齿轮均具有特定的性能特点与适用工况,能够满足多样化的工作环境与载荷需求。 2. 齿轮规格参数:模数大小、压力角数值、齿数数量、分度圆尺寸等是齿轮设计的基础数据,这些参数直接决定了齿轮的物理尺寸与运行性能。 3. 齿轮材质选用:齿轮材料的确定需综合评估其耐磨损性能、硬度水平以及韧性表现,常用的材料包括铸铁、钢材、铝合金等。 4. 齿轮强度验证:需进行齿面接触应力分析与齿根弯曲应力分析,以确保齿轮在实际运行过程中不会出现过度磨损或结构破坏。 5. 齿轮加工工艺:涉及切削加工、滚齿加工、剃齿加工、淬火处理等工艺流程,工艺方案的选择将直接影响齿轮的加工精度与使用寿命。 二、轴设计1. 轴的分类方式:依据轴在机械装置中的功能定位与受力特点,可将轴划分为心轴、转轴以及传动轴等类型。 2. 轴的材料选择:通常采用钢材作为轴的材料,例如碳素结构钢或合金结构钢,特殊需求时可选用不锈钢材料或轻质合金材料。 3. 轴的构造规划:需详细考虑轴的轴向长度、截面直径、键槽布置、轴承安装位置等要素,以满足轴的强度要求、刚度要求以及稳定性要求。 4. 轴的强度验证:需进行轴的扭转强度分析与弯曲强度分析,以防止轴在运行过程中发生塑性变形...

70,036

社区成员

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

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