设置无符号短字符的字节
Byte setting an unsigned short
我正在尝试使用memset
:单独设置无符号短变量中的字节
#include <cstring>
#include <iostream>
int main()
{
unsigned short test2; // 2 bytes
std::cout << "size of test2: " << sizeof(test2) << std::endl;
memset(&test2, 0, 2);
memset(&test2, 0x4D, 1);
memset(&test2+1, 0x42, 1);
std::cout << "value: " << test2 << std::endl;
return 0;
}
我得到的输出是:
size of test2: 2
value: 77
77是0x4D。因此,出于某种原因,它没有获取我试图在变量的第二个字节上设置的0x42。为什么?
&test2+1
实际上会将地址推进sizeof(test2)
,即2,并将指针移动到范围外。
尝试将其转换为char*
:
#include <cstring>
#include <iostream>
int main()
{
unsigned short test2; // 2 bytes
std::cout << "size of test2: " << sizeof(test2) << std::endl;
memset(&test2, 0, 2);
memset(&test2, 0x4D, 1);
memset((char*)&test2+1, 0x42, 1);
std::cout << "value: " << test2 << std::endl;
return 0;
}
表达式&test2+1
按测试大小缩放,因此您设置的是内存中test2
后面的unsigned short
,而不是test2
的顶部字节。由于您引用的unsigned short
未分配,因此您正在调用未定义的行为。
您必须将&test2
强制转换为char *
才能获得1(字节)的缩放:
memset((char *)&test + 1, 0x42, 1);
另一种不使用memset()
:的方法
unsigned short setbytes(unsigned char hi, unsigned char lo)
{
return hi << 8 | lo;
}
...
unsigned short test2 = setbytes(0x42, 0x4D); /* --> 0x424D */
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 多字节字符'377777'如何工作?
- 文件名如何在"char"和2字节字符之间工作
- 在 linux/mac 中获取多字节字符的"char"
- 如何编写完全可移植的 4 字节字符常量的编译时初始化
- 操作多字节字符的字符串
- Visual Studio 多字节字符到单个字节
- 以 C++ 为单位递增 16 字节字符数组
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- C++子字符串多字节字符
- Windows 中的 4 字节字符字符串
- 创建未知长度的字节/字符数组
- 如何提取tar.gz,包括多字节字符和windows上禁止的字符
- Unicode字符或多字节字符:哪种类型更有效?为什么
- 为具有1字节和2字节字符的字符集实现退格
- c++如何获取下一个多字节字符
- 通过boost::asio传输混合unicode和单字节字符的最佳方式
- 如何在 2 字节字符中存储 1 个数字
- C++返回字符串中最常见字符的函数中的错误.多字节字符
- 在MBCS操作系统上运行单字节字符应用程序的风险