把内存中的数据转化成16进制显示

本文介绍了如何将内存中的原始数据转换为16进制格式输出,并详细对比了strcpy与memcpy两个函数的功能特性及使用场景。通过具体代码示例,读者能够了解到这些常用函数的工作原理及注意事项。

今天遇到需要将内存中的原始数据以16进制方式输出:

方法为:

int i=0;
CString str,str1;
unsigned char buf[256];
//buf1是你自己的数据
memcpy(buf,buf1,256);
for(i=0;i<256;i++)
{
str1.Format("%02X ",buf[i]);
str=str+str1;
}

strcpy和memcpy的区别

strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );

char  * strcpy ( char  * dest, const  char  * src) // 实现src到dest的复制
{
   if  ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
  {
 
       return  NULL;
  }
   char  *strdest = dest;        //保存目标字符串的首地址
   while  ((*strDest++ = *strSrc++)!= '\0' ); //把src字符串的内容复制到dest下
   return  strdest;
}
void  * memcpy ( void  *memTo, const  void  *memFrom, size_t  size)
{
   if ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
          return  NULL;
   char  *tempFrom = ( char  *)memFrom;             //保存memFrom首地址
   char  *tempTo = ( char  *)memTo;                  //保存memTo首地址     
   while (size -- > 0)                //循环size次,复制memFrom的值到memTo中
          *tempTo++ = *tempFrom++ ; 
   return  memTo;
}

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy



内存数据的十六进制Print - zhenjing - 博客园
http://www.cnblogs.com/zhenjing/archive/2011/04/20/2021789.html

<think>我们被要求在Excel中将数据换为16进制格式。根据引用[2]和引用[4],Excel提供了DEC2HEX函数用于将十进制换为十六进制数。此外,引用[3]中提到了Python中换的方法,但用户明确要求在Excel中操作。步骤:1.如果数据是十进制数,直接使用DEC2HEX函数。2.如果数据文本(包括中文字符),需要先将每个字符换为对应的ASCII或Unicode码,然后再换为十六进制。但Excel本身没有直接换整个字符串为十六进制的函数,需要借助VBA或者分步处理。考虑到用户可能有两种需求:需求一:将十进制数字换为十六进制数字(无符号或有符号)。需求二:将字符串(如中文字符、英文字符)换为十六进制表示。针对需求一(十进制数字十六进制):使用函数:DEC2HEX(number,[places])-number:要换的十进制数。-places(可选):要使用的字符数。如果省略,函数将使用最少必要的字符数。示例:=DEC2HEX(10)返回"A"=DEC2HEX(10,4)返回"000A"注意:DEC2HEX函数换的是无符号整数,换范围是0到549755813887(即16进制FFFFFFFFF,40位)。如果数字是负数,DEC2HEX函数会将其视为补码形式,但引用[4]提到有符号数的换需要另外处理。不过,DEC2HEX函数本身支持负数换,它会返回该负数的补码表示的十六进制,但要求数字在-549755813888到549755813887之间。例如:=DEC2HEX(-1)返回"FFFFFFFFF"(40位,因为负数用补码表示,且函数返回40位结果)如果用户需要将有符号的16位数(范围-32768到32767)换为16进制(4个字符),可以使用:=DEC2HEX(MOD(数字,65536),4)这样,负数会自动以补码形式表示(在16位范围内)。针对需求二(字符串十六进制):Excel没有直接的内置函数将整个字符串换为十六进制字符串。我们可以通过以下步骤实现:1.将字符串拆分为单个字符(使用MID函数)。2.对每个字符使用CODE函数获取其Unicode码(或者ASCII码,对于英文字符两者一致)。3.将获取的Unicode码用DEC2HEX函数换为十六进制。4.将每个字符的十六进制结果连接起来。例如,将A1单元格中的字符串换为连续的十六进制字符串(每个字符的十六进制用空格分隔):我们可以使用一个公式,但Excel没有直接遍历字符串的函数,需要借助数组公式或拖拽填充。方法1:使用辅助列(适合短字符串)假设字符串在A1,我们在B1输入:=MID($A$1,ROW(A1),1)然后向下拖拽直到出现空值(表示字符串结束)。在C1输入:=DEC2HEX(CODE(B1),2)(如果Unicode码在0-255之间,可以用2位表示,但中文字符的Unicode码通常大于255,所以需要4位)实际上,中文字符的Unicode码通常需要4位十六进制数表示。因此,我们可以用4位:=DEC2HEX(CODE(B1),4)然后,在D1使用CONCATENATE函数或者TEXTJOIN函数将C列的结果连接起来(用空格分隔):=TEXTJOIN("",TRUE,C1:C10)方法2:使用数组公式(Excel365或支持动态数组的版本)在B1输入:=TEXTJOIN("",TRUE,DEC2HEX(CODE(MID(A1,SEQUENCE(LEN(A1)),1)),4))解释:SEQUENCE(LEN(A1))生成1到字符串长度的序列。MID(A1,序列,1)将字符串拆分成单个字符的数组。CODE函数作用于每个字符得到Unicode码数组。DEC2HEX函数将每个Unicode码换为4位十六进制(不足4位前面补0)。TEXTJOIN用空格连接所有结果。注意:如果Excel版本不支持SEQUENCE函数,可以使用传统数组公式(按Ctrl+Shift+Enter):=TEXTJOIN("",TRUE,DEC2HEX(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),4))但是,ROW(INDIRECT(...))在TEXTJOIN中可能无法直接作为数组,因此可能需要使用VBA自定义函数。如果用户需要换中文字符串,则必须使用4位十六进制,因为中文字符的Unicode码通常大于65535的很少,4位足够(基本多文种平面)。例如:"中"的Unicode码是20013,换为十六进制是4E2D(4位)。总结:1.数字十六进制:DEC2HEX函数。2.字符串十六进制:分拆字符,用CODE函数取码,再用DEC2HEX换,最后连接。下面给出具体示例:示例1:十进制十六进制A1:100B1:=DEC2HEX(A1)->64B2:=DEC2HEX(A1,4)->0064示例2:负数十六进制16位有符号数)A1:-1如果我们想得到4位的补码表示(即FFFF):=DEC2HEX(MOD(A1,65536),4)->FFFF(因为-1mod65536等于65535,而DEC2HEX(65535,4)就是FFFF)示例3:字符串"Hello"十六进制(每个字符2位,因为都是ASCII字符)使用公式(数组公式,按Ctrl+Shift+Enter):=TEXTJOIN("",TRUE,DEC2HEX(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),2))结果:48656C6C6F示例4:中文字符"中"十六进制使用公式(数组公式):=TEXTJOIN("",TRUE,DEC2HEX(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),4))结果:4E2D注意:如果字符串很长,使用数组公式可能会复杂,也可以考虑用VBA编写自定义函数。相关问题:1.Excel中如何将十六进制换回十进制数?2.如何将十六进制字符串换回文本?3.Excel中处理有符号十六进制数时需要注意什么?</think>在Excel中将数据换为16进制格式有以下几种方法,根据数据类型和需求选择相应方案: ### 一、数字16进制(无符号) 使用`DEC2HEX`函数: ```excel =DEC2HEX(数字, [位数]) ``` - **示例**: - `=DEC2HEX(255)` → `FF` - `=DEC2HEX(10, 4)` → `000A`(固定4位宽度)[^2] ### 二、数字16进制(有符号) 对有符号数需进行补码处理: ```excel =IF(数字 >= 0, DEC2HEX(数字, 位数), DEC2HEX(65536 + 数字, 位数) -- 16位系统示例 ) ``` - **示例**(16位系统): - `=IF(-1466>=0, DEC2HEX(-1466), DEC2HEX(65536-1466,4))` → `FA46`[^4] ### 三、文本16进制 通过`CODE`+`DEC2HEX`组合: ```excel =TEXTJOIN("", TRUE, DEC2HEX(CODE(MID(文本, ROW(INDIRECT("1:"&LEN(文本))), 1)), 2) ) ``` 按<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Enter</kbd>执行数组公式 - **示例**: - "AB" → `4142`(A=65=0x41, B=66=0x42) - "中" → `4E2D`(Unicode编码)[^1][^3] ### 四、批量换技巧 1. **填充序列**:输入公式后拖动填充柄批量换 2. **自定义格式**:对16进制结果应用格式`0000`保持位数一致 3. **错误处理**:嵌套`IFERROR`避免无效值 ```excel =IFERROR(DEC2HEX(A2), "N/A") ``` ### 五、换效果对比 | 原始数据 | 公式 | 16进制结果 | |----------|--------------------------|-----------| | 255 | `=DEC2HEX(A2)` | FF | | -1466 | 有符号换公式 | FA46 | | "Hello" | 文本换公式 | 48656C6C6F | | "中国" | 文本换公式 | 4E2D56FD | > **操作提示**: > 1. 中文换依赖系统Unicode编码 > 2. 有符号换需根据系统位数调整模数(16位用65536,32位用4294967296) > 3. 文本换公式仅支持单字节字符,双字节字符需特殊处理[^1] --- ### 相关问题 1. **Excel中如何将16进制换回十进制?** > 使用`HEX2DEC`函数:`=HEX2DEC("FF")`返回255[^2] 2. **如何处理超过16位的超大数字换?** > Excel内置函数限制10进制数范围(-549,755,813,888 到 549,755,813,887),超限需用VBA自定义函数 3. **如何避免换后的16进制值被识别为文本?** > 使用`TEXT`函数强制格式:`=TEXT(DEC2HEX(A1),"0000")` 4. **Excel能否直接显示内存地址格式的16进制?** > 可自定义格式:`"0x"@` → 输入`4E2D`显示为`0x4E2D` [^1]: 中文字符换依赖Unicode编码,不同系统可能有差异 [^2]: `DEC2HEX`函数支持无符号换,负数需特殊处理 [^3]: 文本换本质是提取字符编码再16进制 [^4]: 有符号数换需用补码机制处理负数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值