首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++:如何将数组中的2个字节转换为无符号短整型

C++:如何将数组中的2个字节转换为无符号短整型
EN

Stack Overflow用户
提问于 2008-11-19 02:05:43
回答 9查看 42.9K关注 0票数 19

我一直在开发一个遗留的C++应用程序,这绝对超出了我的舒适区(这是一件好事)。我想知道有没有人愿意给我一些建议(双关语)。

我需要将无符号字符数组中的2个字节转换为无符号短整型。字节是连续的。

下面是我想要做的一个例子:

我从套接字接收一个字符串,并将其放在一个无符号字符数组中。我可以忽略第一个字节,然后将接下来的两个字节转换为无符号字符。这将只在windows上,所以没有大端/小端问题(据我所知)。

下面是我现在所拥有的(显然不起作用):

代码语言:javascript
复制
//packetBuffer is an unsigned char array containing the string "123456789" for testing
//I need to convert bytes 2 and 3 into the short, 2 being the most significant byte
//so I would expect to get 515 (2*256 + 3) instead all the code I have tried gives me
//either errors or 2 (only converting one byte
unsigned short myShort;
myShort = static_cast<unsigned_short>(packetBuffer[1])
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-11-19 02:24:52

那么,您正在将char加宽为一个短值。您想要的是将两个字节解释为短字节。static_cast无法从unsigned char*强制转换为unsigned short*。您必须先转换为void*,然后转换为unsigned short*

代码语言:javascript
复制
unsigned short *p = static_cast<unsigned short*>(static_cast<void*>(&packetBuffer[1]));

现在,您可以取消引用p并获得短值。但这种方法的问题是,您从unsigned char*转换为void*,然后转换为某些不同的类型。该标准并不保证地址保持不变(此外,取消引用该指针将是未定义的行为)。一种更好的方法是使用位移位,它总是有效的:

代码语言:javascript
复制
unsigned short p = (packetBuffer[1] << 8) | packetBuffer[2];
票数 24
EN

Stack Overflow用户

发布于 2008-11-19 02:15:11

这可能远远低于您所关心的,但请记住,这样做很容易获得未对齐的访问。x86是容错的,未对齐访问导致的中止将在内部捕获,并最终得到值的副本和返回值,因此您的应用程序不会知道任何不同之处(尽管它比对齐访问慢得多)。但是,如果这段代码将在非x86平台上运行(您没有提到目标平台,所以我假设是x86桌面Windows),那么这样做将导致处理器数据中止,并且在尝试强制转换数据之前,您必须手动将数据复制到对齐的地址。

简而言之,如果您要经常进行这种访问,您可能会考虑对代码进行调整,以避免未对齐的读取,您将看到性能上的好处。

票数 4
EN

Stack Overflow用户

发布于 2008-11-19 02:28:06

代码语言:javascript
复制
unsigned short myShort = *(unsigned short *)&packetBuffer[1];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/300808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档