相关疑难解决方法(0)

"POSIX"是什么意思?

什么是POSIX?我已阅读维基百科的文章,每次遇到这个词时我都会阅读它.事实是,我从来没有真正理解它是什么.

任何人都可以通过解释"对POSIX的需求"向我解释一下吗?

unix linux posix terminology

822
推荐指数
8
解决办法
29万
查看次数

C++中的64位ntohl()?

手册页htonl()似乎暗示您只能将其用于最多32位值.(实际上,ntohl()定义为无符号长整数,在我的平台上是32位.我想如果无符号长整数是8个字节,它将适用于64位整数).

我的问题是我需要将64位整数(在我的例子中,这是一个无符号长long)从big endian转换为little endian.现在,我需要进行特定的转换.但ntohl()如果目标平台WAS大端,如果函数(如)不会转换我的64位值,它会更好.(我宁愿避免添加我自己的预处理器魔法来做到这一点).

我可以用什么?如果它存在,我想要标准的东西,但我愿意接受实施建议.我在过去使用过工会看过这种类型的转换.我想我可以拥有一个带有unsigned long long和char [8]的联合.然后相应地交换字节.(显然会在大端的平台上破解).

c++ linux 64-bit endianness

59
推荐指数
8
解决办法
8万
查看次数

如何编写endian不可知的C/C++代码?

我做了一些谷歌搜索,在这个问题上找不到任何好文章.在实现我想要与endian无关的应用程序时,我应该注意什么?

c c++ endianness

35
推荐指数
4
解决办法
2万
查看次数

如何让GCC为没有内置的大端存储生成bswap指令?

我正在研究一种以大端格式将64位值存储到内存中的函数.我希望我能编写可在小端大端平台上运行的移植C99代码,并让现代x86编译器bswap自动生成指令而不需要任何内置函数或内在函数.所以我开始使用以下功能:

#include <stdint.h>

void
encode_bigend_u64(uint64_t value, void *vdest) {
    uint64_t bigend;
    uint8_t *bytes = (uint8_t*)&bigend;
    bytes[0] = value >> 56;
    bytes[1] = value >> 48;
    bytes[2] = value >> 40;
    bytes[3] = value >> 32;
    bytes[4] = value >> 24;
    bytes[5] = value >> 16;
    bytes[6] = value >> 8;
    bytes[7] = value;
    uint64_t *dest = (uint64_t*)vdest;
    *dest = bigend;
}
Run Code Online (Sandbox Code Playgroud)

这适用于clang,它将此函数编译为:

bswapq  %rdi
movq    %rdi, (%rsi)
retq
Run Code Online (Sandbox Code Playgroud)

但是GCC 无法检测到字节交换 …

c x86 gcc endianness compiler-optimization

19
推荐指数
2
解决办法
7215
查看次数

Windows上的endian.h

我正在做一个我需要的跨平台项目endian.h。但是此文件不在Windows或Mac OS X上。

有什么方法可以让我在没有文件的情况下正常工作,还是有办法获取文件?

c++ windows cross-platform

2
推荐指数
1
解决办法
1万
查看次数

发送或接收结构时的字节对齐

我在编写网络软件时面临一些问题.当我尝试发送或接收包含8字节数据类型的结构时,下一个发送或接收的结构以某种方式受到影响.我有几点想法,但首先我想在进入调试之前确认一件事.我在64位x-86系统上使用32位Ubuntu 11.04(愚蠢的我).这与字节对齐问题有什么关系吗?

我正在开发一个控制器来与Open Flow交换机通信.openflow协议根据构建的交换机定义一组规范.问题是当我尝试与交换机通信时,一切正常,直到我发送或接收包含64位日期类型(uint64_t)的结构.用于发送和接收功能的特定结构是

estruct ofp_header {
uint8_t version;    /* OFP_VERSION. */
uint8_t type;       /* One of the OFPT_ constants. */
uint16_t length;    /* Length including this ofp_header. */
uint32_t xid;       /* Transaction id associated with this packet.
                       Replies use the same id as was in the request
                       to facilitate pairing. */};   
 assert(sizeof(struct ofp_header) == 8);




/* Switch features. */
struct ofp_switch_features {
struct ofp_header header;
uint64_t datapath_id; /* Datapath unique ID. The lower 48-bits are for a MAC address, …
Run Code Online (Sandbox Code Playgroud)

c c++ sockets linux network-programming

0
推荐指数
1
解决办法
448
查看次数

如何将数组的值设置为单个变量

我正在从ARM micro的SD卡中读取值:

Res = f_read(&fil, (void*)buf, 6, &NumBytesRead);
Run Code Online (Sandbox Code Playgroud)

where fil是指针,buf是存储数据的缓冲区。

这就是问题所在:这是一个数组,但我想将该数组的内容放在单个变量中。

举一个实际的例子:从文件中读取的6个字节是:

buf[0] = 0x1B
buf[1] = 0x26
buf[2] = 0xB3
buf[3] = 0x54
buf[4] = 0xA1
buf[5] = 0xCF
Run Code Online (Sandbox Code Playgroud)

我想拥有:uint64_t data等于 0x1B26B354A1CF。也就是说,数组的所有元素都以一个64位整数“级联”。

c arrays

0
推荐指数
1
解决办法
92
查看次数