VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 117|回复: 7

[交流] VC有没有8位的整形,32位的数据转换为单字节数据,有没有什么好方法?

[复制链接]
96_avatar_middle
最佳答案
0 
在线会员 发表于 2021-11-16 08:46:20 | 显示全部楼层 |阅读模式
VC有没有8位的整形,32位的数据转换为单字节数据,有没有什么好方法?
我需要把一些数据以单字节16进制的形式放在一个数组里面,最初是从字符串经过strtol函数转换为32为long的,还要变为单字节,有点麻烦。感觉这是不是VC的弱点啊?就是数据的按字节拆分和组合方面。




上一篇:求开源类StaticEx.h和StaticEx.cpp
下一篇:long long 类型用不对,是为啥?本来高位应该为0x5a,结果却是全F
00_avatar_middle
最佳答案
11 
在线会员 发表于 2021-11-16 13:03:06 | 显示全部楼层
int转byte[]  涉及位运算和大小端转换规则
int i=2000;
byte j[4];
j[0]=(byte)(i & 0xFF) ;
j[1]=(byte)((i >> 8) & 0xFF)
j[2]=(byte)((i >> 16) & 0xFF)
j[3]=(byte)((i >> 24) & 0xFF)
INT64   UINT64 属于8字节整形以此类推
(byte)((i >> 32) & 0xFF)
(byte)((i >> 40) & 0xFF)
(byte)((i >> 48) & 0xFF)
(byte)((i >> 56) & 0xFF)
看起来神秘,其实说穿了一文不值
VC有没有8位的整形,32位的数据转换为单字节数据,有没有什么好方法?
07_avatar_middle
最佳答案
8 
在线会员 发表于 2021-11-16 09:01:59 | 显示全部楼层
个人感觉,实现方式还是挺多的,
union{
long lData;
char cData[4];
};这样不是直接可以按自己了么?
还可以这样:
long lData;
char* pData = (char*)&lData;
这样pData[0],pData[1],pData[2],pData[3]不就是字节数据了么?

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
96_avatar_small 不说人过 + 1 + 1 很给力!

查看全部评分

96_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-16 10:27:18 | 显示全部楼层
freehawkzk 发表于 2021-11-16 09:01
个人感觉,实现方式还是挺多的,
union{
long lData;


感恩回复,我试了一下,数据没有出来哦,试了换为单字节的,A,W模式都试了都是乱码,不是要的数据。
96_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-16 10:29:03 | 显示全部楼层
本帖最后由 不说人过 于 2021-11-16 10:30 编辑
  1. #include "stdafx.h"

  2. #include <iostream>
  3. using namespace std;

  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.         long lData =0x55aa6644;
  7.         char* pData = (char*)&lData;
  8.         //这样pData[0],pData[1],pData[2],pData[3]不就是字节数据了么?
  9.        
  10.         cout<< "  "<<pData[0]<< "  "<<pData[1]<< "  "<<pData[2]<< "  "<<pData[3]<<endl;
  11.        
  12.        
  13.         return 0;
  14. }



复制代码
07_avatar_middle
最佳答案
8 
在线会员 发表于 2021-11-16 10:56:31 | 显示全部楼层


你说的乱了是说cout输出不是55,66,之类的吧?
1、建议了解一下ascii码,分清楚哪些是可以直接显示的,哪些字符在终端上无法显示。了解一下ascii码值与我们平常看到的字符之间的关系。
2、建议了解一下10进制和16进制显示时,在调试时看到的数据的区别。
3、建议了解一下大小端模式,0x55aa6644具体在内存中存的时候4个字节各存的是啥。

总之,看似很简单的一个需求,貌似需要了解的东西还挺多。

加油
96_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-16 14:51:23 | 显示全部楼层
感恩回复,学到了字符指针和移位都可以实现多字节变为单字节。
96_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-16 14:55:46 | 显示全部楼层
  1. // ZIJIE.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <iostream>
  5. //#include <windef.h>
  6. //#include <rpcndr.h>
  7. using namespace std;
  8. typedef unsigned char byte;
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.         long lData =0x55aa6644;
  12.         char* pData = (char*)&lData;
  13.         //这样pData[0],pData[1],pData[2],pData[3]不就是字节数据了么?
  14.         unsigned short zs3 =(byte)pData[3];
  15.         unsigned short zs2 =(byte)pData[2];
  16.         unsigned short zs1 =(byte)pData[1];
  17.         unsigned short zs0 =(byte)pData[0];
  18.         /*byte zs3 =(byte)pData[3];
  19.         byte zs2 =(byte)pData[2];
  20.         byte zs1 =(byte)pData[1];
  21.         byte zs0 =(byte)pData[0];*/
  22.         cout<<hex<<zs3<<zs2<<zs1<<zs0<<endl;
  23.         cout<<hex<<pData[0]<<pData[1]<<pData[2]<<pData[3]<<endl;
  24.        

  25.         //int转byte[]  涉及位运算和大小端转换规则
  26.         //        int i=2000;
  27. /*  int i = 0x22334455;
  28.         byte j[4];
  29.         j[0]=(byte)(i & 0xFF) ;
  30.         j[1]=(byte)((i >> 8) & 0xFF);
  31.                 j[2]=(byte)((i >> 16) & 0xFF);
  32.                 j[3]=(byte)((i >> 24) & 0xFF);
  33.                 cout<<hex<<j[3]<<j[2]<<j[1]<<j[0]<<endl;*/
  34.         return 0;
  35. }

复制代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-11-30 01:25

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表