当前位置:  开发笔记 > 编程语言 > 正文

从char*数组中读取"整数"大小的字节.

如何解决《从char*数组中读取"整数"大小的字节.》经验,为你挑选了2个好方法。

我想sizeof(int)char* 数组中读取字节.

a)在什么情况下我们需要担心是否需要检查字节序?

b)如何考虑或不考虑字节顺序,您将如何读取前4个字节.

编辑:sizeof(int)我读取的字节需要与整数值进行比较.

解决这个问题的最佳方法是什么?



1> Dani van der..:

你的意思是这样的吗?:

char* a;
int i;
memcpy(&i, a, sizeof(i));

如果数据源来自不同的平台(如设备),则只需担心字节序.



2> Matt Davis..:

a)如果数据是在big-endian机器上创建的,并且正在小端机器上处理,反之亦然,你只需要担心"字节序"(即字节交换).有很多方法可以实现,但这里有几个例子.

    您通过套接字在Windows计算机上接收数据.Windows采用little-endian架构,而网络数据"应该"采用big-endian格式.

    您处理在具有不同"字节顺序"的系统上创建的数据文件.

在任何一种情况下,您都需要对大于1个字节的所有数字进行字节交换,例如,short,int,long,double等.但是,如果您始终处理来自同一平台的数据,则问题无关紧要.

b)根据你的问题,听起来你有一个char指针,想要将前4个字节作为int提取,然后处理任何endian问题.要进行提取,请使用:

int n = *(reinterpret_cast(myArray)); // where myArray is your data

显然,这假设myArray不是空指针; 否则,这会崩溃,因为它取消引用指针,所以采用一个良好的防御性编程方案.

要在Windows上交换字节,可以使用winsock2.h中定义的ntohs()/ ntohl()和/或htons()/ htonl()函数.或者您可以编写一些简单的例程来在C++中执行此操作,例如:

inline unsigned short swap_16bit(unsigned short us)
{
    return (unsigned short)(((us & 0xFF00) >> 8) |
                            ((us & 0x00FF) << 8));
}

inline unsigned long swap_32bit(unsigned long ul)
{
    return (unsigned long)(((ul & 0xFF000000) >> 24) |
                           ((ul & 0x00FF0000) >>  8) |
                           ((ul & 0x0000FF00) <<  8) |
                           ((ul & 0x000000FF) << 24));
}

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有