MFC 编辑框输入内容转成16进制数并以主机字节序存到数组

cky77 2018-11-01 05:06:35
RT,emmm...
我需要在编辑框输入一串数字,然后将数字转成16进制,再以主机字节序(字节逆序)存储memcpy到数组中。
在输入<=4字节数据时比如11223344,我是可以实现的

CString valueofPara = m_list_dataInput.GetItemText(i, 3);

int y = ntohl(strtol(valueofPara, NULL, 16));

memcpy(&pDataDataInput[vernier + 2], &y, 4);

但是当输入大于4字节时,该如何实现呢?
比如输入112233445566778899
...全文
189 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cky77 2018-11-06
  • 打赏
  • 举报
回复
pDataDataInput[0] = (HexValue(tem[0]) << 4) + HexValue(tem[1]);

int HexValue(unsigned char a)
{
a -= 48;// '0' 0x30
if (a >32) a -= 32;// 'a' 0x61
if (a > 9) a -= 7;// 'A' 0x41
return a;
}

我最后这样写的,参考了schlafenhamster大哥别的帖子。感谢。
schlafenhamster 2018-11-03
  • 打赏
  • 举报
回复
VOID ReverseBytes(BYTE bt[],int len)
{
int steps=len/2;// odd or even !
int i,j;
for(j=len-1,i=0; i<steps ; j--,i++)
{
BYTE tmp1,tmp2;
tmp1=bt[i];tmp2=bt[j];
bt[i]=tmp2;
bt[j]=tmp1;
}
}
// 调用
BYTE bt7[]={0x77,0x66,0x55,0x44,0x33,0x22,0x11};
ReverseBytes(bt7,sizeof(bt7));// 11 22 33 44 55 66 77
Eleven 2018-11-03
  • 打赏
  • 举报
回复
当成字符串处理,然后转成Hex数组
schlafenhamster 2018-11-02
  • 打赏
  • 举报
回复
ULONG ul=0x12345678;
SwapULong(&ul);// 0x78563412

temp = (LONG) ((BYTE) *p); // 取当前 字节 0x78 little endian
temp <<= 8; // *256, 0x7800
*p >>=8; // 移动 到 下个 字节 056
temp += (LONG) ((BYTE) *p); // 0x7856
......
cky77 2018-11-02
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:

VOID SwapULong (PULONG p)
{
ULONG temp;

temp = (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
*p = temp;
}

老大,我....看不懂
schlafenhamster 2018-11-02
  • 打赏
  • 举报
回复
注意 ULONG ul=0x12345678;
*p >>=8; // =0x00123456 移动 到 下个 字节 056
schlafenhamster 2018-11-02
  • 打赏
  • 举报
回复
但是这样对输入数据的长度是有限制的对不对
对 函数名 叫 SwapULong 即 4字节。
你可以 扩展到 一定 长度 如 int64 (8字节)
cky77 2018-11-02
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
ULONG ul=0x12345678;
SwapULong(&ul);// 0x78563412

temp = (LONG) ((BYTE) *p); // 取当前 字节 0x78 little endian
temp <<= 8; // *256, 0x7800
*p >>=8; // 移动 到 下个 字节 056
temp += (LONG) ((BYTE) *p); // 0x7856
......

但是这样对输入数据的长度是有限制的对不对?
赵4老师 2018-11-02
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

理解讨论之前请先学会如何观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
zgl7903 2018-11-01
  • 打赏
  • 举报
回复
不要纠结于memcpy 逐字节赋值就是了
schlafenhamster 2018-11-01
  • 打赏
  • 举报
回复

VOID SwapULong (PULONG p)
{
ULONG temp;

temp = (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
temp <<= 8;
*p >>=8;

temp += (LONG) ((BYTE) *p);
*p = temp;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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