使用Memcopy进行八位char 跟十六位的short之间的转化

张亚成 2014-04-29 05:39:40
在程序中有时候需要把十六位的short数组转化成八位的char数组,有时候需要把八位的char数组转化成十六位的short数组,看到别的程序上写的是使用memcopy就完成了,
如:
char ch【4】 = {0x01,0x02,0x03,0x04};
short sh[2];
memcopy(sh, ch, 4);
此时 : sh[2] = {0x0102, 0x0304}


但是我总感觉这个使用方法可能会不妥 ?请大家帮忙指点一下。
...全文
441 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiminixi 2014-04-30
  • 打赏
  • 举报
回复
引用 11 楼 zhangyacheng_1 的回复:
[quote=引用 10 楼 qiminixi 的回复:] [quote=引用 5 楼 baichi4141 的回复:] [quote=引用 4 楼 qiminixi 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
得到0x0201, 0x0403是用小头优先得到吧,但是内存中还是0x01020304。这是如何看待数据的问题[/quote] 你算两个int相加的时候不会关心内存中的数据是小头还是大头 数据类型本身就是如何看待数据的标准,如果没有这个需求,何必char转short?既然转了,就代表要用short来做什么[/quote] 如果只认为char转short是为了数0x01与数0x02前后合并后得到数0x0102那我也没什么好说的了。而用这种方法在需要跨平台兼容的情况下也是错误的。[/quote] 最初转化的目的是因为我操作的程序获取到的数据是unsigned char 型的数据,在传送给调用函数的时候调用函数使用的数据类型是unsigned short 类型的 , 调用函数是别人给的dll [/quote] 这样的话,用类转换(unsigned short*)pPtr就可以了。。
张亚成 2014-04-30
  • 打赏
  • 举报
回复
引用 10 楼 qiminixi 的回复:
[quote=引用 5 楼 baichi4141 的回复:] [quote=引用 4 楼 qiminixi 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
得到0x0201, 0x0403是用小头优先得到吧,但是内存中还是0x01020304。这是如何看待数据的问题[/quote] 你算两个int相加的时候不会关心内存中的数据是小头还是大头 数据类型本身就是如何看待数据的标准,如果没有这个需求,何必char转short?既然转了,就代表要用short来做什么[/quote] 如果只认为char转short是为了数0x01与数0x02前后合并后得到数0x0102那我也没什么好说的了。而用这种方法在需要跨平台兼容的情况下也是错误的。[/quote] 最初转化的目的是因为我操作的程序获取到的数据是unsigned char 型的数据,在传送给调用函数的时候调用函数使用的数据类型是unsigned short 类型的 , 调用函数是别人给的dll
qiminixi 2014-04-30
  • 打赏
  • 举报
回复
引用 5 楼 baichi4141 的回复:
[quote=引用 4 楼 qiminixi 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
得到0x0201, 0x0403是用小头优先得到吧,但是内存中还是0x01020304。这是如何看待数据的问题[/quote] 你算两个int相加的时候不会关心内存中的数据是小头还是大头 数据类型本身就是如何看待数据的标准,如果没有这个需求,何必char转short?既然转了,就代表要用short来做什么[/quote] 如果只认为char转short是为了数0x01与数0x02前后合并后得到数0x0102那我也没什么好说的了。而用这种方法在需要跨平台兼容的情况下也是错误的。
张亚成 2014-04-30
  • 打赏
  • 举报
回复
还有别的错误可能性吗 ?
张亚成 2014-04-30
  • 打赏
  • 举报
回复
引用 6 楼 baichi4141 的回复:
[quote=引用 2 楼 zhangyacheng_1 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
此话确定有根据吗, 公司给的参考代码是这个样的写法,发布过的很多程序中就采用的这个方法, 怎么查看机子是使用的什么字节序 ?[/quote] 如果你公司的程序不需要考虑更换运行环境(例如绑定在你公司提供的电脑上不允许在其他电脑上运行),那就随意吧 如果你公司的程序有可能复制到另一台不同硬件的CPU上,那这就是程序BUG,这种程序发布出去就是不负责任 要查看字节序,就用这种方法,设置一个多字节整数为1,用char指针指向它,看第一个字节和最后一个字节哪个是1[/quote] 谢谢你的指点
Lionheartch 2014-04-30
  • 打赏
  • 举报
回复
进来观望学习的
baichi4141 2014-04-30
  • 打赏
  • 举报
回复
引用 2 楼 zhangyacheng_1 的回复:
[quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
此话确定有根据吗, 公司给的参考代码是这个样的写法,发布过的很多程序中就采用的这个方法, 怎么查看机子是使用的什么字节序 ?[/quote] 如果你公司的程序不需要考虑更换运行环境(例如绑定在你公司提供的电脑上不允许在其他电脑上运行),那就随意吧 如果你公司的程序有可能复制到另一台不同硬件的CPU上,那这就是程序BUG,这种程序发布出去就是不负责任 要查看字节序,就用这种方法,设置一个多字节整数为1,用char指针指向它,看第一个字节和最后一个字节哪个是1
baichi4141 2014-04-30
  • 打赏
  • 举报
回复
引用 4 楼 qiminixi 的回复:
[quote=引用 1 楼 baichi4141 的回复:] 嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
得到0x0201, 0x0403是用小头优先得到吧,但是内存中还是0x01020304。这是如何看待数据的问题[/quote] 你算两个int相加的时候不会关心内存中的数据是小头还是大头 数据类型本身就是如何看待数据的标准,如果没有这个需求,何必char转short?既然转了,就代表要用short来做什么
张亚成 2014-04-30
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
这个好像不影响这个题目
赵4老师 2014-04-30
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
张亚成 2014-04-30
  • 打赏
  • 举报
回复
回复 : qiminixi 你意思直接使用 short 类型的指针指向char型的数组就行 ? 这样就可以把原来char数组使用两个两个的读给 short 变量么 ? 如果是这个样子,那么就跟 memcopy 是同一个意思。
qiminixi 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
得到0x0201, 0x0403是用小头优先得到吧,但是内存中还是0x01020304。这是如何看待数据的问题
张亚成 2014-04-29
  • 打赏
  • 举报
回复
这样做除了字节序可能存在问题之外,还有别的错误可能性吗 ?
张亚成 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}
此话确定有根据吗, 公司给的参考代码是这个样的写法,发布过的很多程序中就采用的这个方法, 怎么查看机子是使用的什么字节序 ?
baichi4141 2014-04-29
  • 打赏
  • 举报
回复
嗯,有字节序的问题 在另一台机器上结果可能是sh[2] = {0x0201, 0x0403}

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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