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

neuredfox 2013-10-23 02:58:51
这个怎么弄啊 我才学C语言,谢谢。
...全文
24875 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/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
高效的多分辨率融合技术对具有标签不确定性的遥感数据进行处理(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的高效多分辨率融合技术,用于处理具有标签不确定性的遥感数据。该方法通过融合不同分辨率的遥感图像,提升数据的空间与光谱信息一致性,有效应对遥感数据中标注不准确或模糊的问题,从而提高后续分类、检测或识别任务的精度与鲁棒性。文中详细阐述了算法的核心流程,包括多尺度数据配准、特征提取、不确定性建模及融合策略优化,并提供了完整的Matlab实现代码,便于科研人员复现实验并进行二次开发。; 适合人群:具备一定遥感图像处理基础和Matlab编程能力的研究生、科研人员及从事地理信息系统、环境监测、城市规划等相关领域的技术人员。; 使用场景及目标:①应用于土地利用分类、环境变化监测、灾害评估等存在标注误差的实际遥感项目中;②旨在提升遥感数据分析的准确性与可靠性,特别是在训练样本有限或标签质量较低的情况下;③为相关领域提供可复现的技术方案与代码参考。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现细节,重点关注多分辨率配准与不确定性融合模块的设计逻辑,同时可尝试在自有数据集上进行迁移实验以加深理解。

70,036

社区成员

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

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