- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将我的应用程序从 macOS 平台移植到 Windows 平台(这里是 Cygwin)。我遇到网络函数 ntohll() 和 htonll() 的问题,而 ntohl()/htonl() 和 ntohs()/htons() 似乎工作正常
/* LACK OF ntohll() function definition on Cygwin */
// convert int64 from network to host representation
*int64 = ntohll(network_int64);
/* SEEMS TO WORK CORRECTLY */
// convert int32 from network to host representation
*int32 = ntohl(network_int32);
更新:这个怎么样?
uint64_t ntohll(uint64_t network_num64) {
uint32_t network_num32[2];
uint32_t host_num32[2];
uint64_t host_num64;
memcpy(network_num32, &network_num64, sizeof(network_num64));
host_num32[0] = ntohl(network_num32[0]);
host_num32[1] = ntohl(network_num32[1]);
memcpy(&host_num64, host_num32, sizeof(host_num64));
return host_num64;
}
和
uint64_t htonll(uint64_t host_num64) {
uint32_t host_num32[2];
uint32_t network_num32[2];
uint64_t network_num64;
memcpy(host_num32, &host_num64, sizeof(host_num64));
network_num32[0] = htonl(host_num32[0]);
network_num32[1] = htonl(host_num32[1]);
memcpy(&network_num64, network_num32, sizeof(network_num64));
return network_num64;
}
最佳答案
我编写了自己的 htonll() 和 ntohll() 函数,可以解决 uint64_t(64 位数字)情况下 Cygwin 上的字节顺序问题。我认为它应该有效,但也希望您证明它确实是一个很好的解决方案。
我编写了以下函数:1. isBigEndian() 和 isLittleEndian() - 检查当前主机使用的是大端还是小端2. 我假设网络字节顺序是大端字节序。因此,如果当前主机上有小端字节序,我将需要交换字节序,如果是大端字节序,我只能使用 htonll()/ntohll() 参数编号中收到的字节序。3.我编写了一个函数,可以将 64 位数字的字节序从大或小分别交换为小或大,即 swapEndianness()
这是所有代码:
bool isBigEndian() {
int n = 1;
// little endian if true
if(*(char *)&n == 1) {
return false;
}
return true;
}
bool isLittleEndian() {
return !(isBigEndian());
}
uint64_t swapEndianness(uint64_t num) {
uint64_t b0, b1, b2, b3, b4, b5, b6, b7;
uint64_t swapped_num;
b0 = (num & 0x00000000000000ff) << 56u;
b1 = (num & 0x000000000000ff00) << 40u;
b2 = (num & 0x0000000000ff0000) << 24u;
b3 = (num & 0x00000000ff000000) << 8u;
b4 = (num & 0x000000ff00000000) >> 8u;
b5 = (num & 0x0000ff0000000000) >> 24u;
b6 = (num & 0x00ff000000000000) >> 40u;
b7 = (num & 0xff00000000000000) >> 56u;
swapped_num = b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7;
return swapped_num;
}
uint64_t htonll(uint64_t host_num64) {
if(isLittleEndian()) {
// swap little endian to big endian (network byte order)
return swapEndianness(host_num64);
}
return host_num64;
}
uint64_t ntohll(uint64_t network_num64) {
if(isLittleEndian()) {
// swap big endian (network byte order) to little endian
return swapEndianness(network_num64);
}
return network_num64;
}
我还测试了上面的代码:
static void test_swap_endianness(void) {
uint64_t number = 0x1123456789ABCDEF;
printf("hex number = 0x%" PRIx64 "\n", number);
uint64_t swappedNumber = swapEndianness(number);
printf("hex swapped number: 0x%" PRIx64 "\n", swappedNumber);
}
并在交换 uint64_t 数字的字节顺序时实现正确的输出:
=========== test_swap_endianness ==============
hex number = 0x1123456789abcdef
hex swapped number: 0xefcdab8967452311
关于C/Cygwin : Porting htoll() from macOS/unix to Windows Cygwin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847798/
假设我有一个在 cygwin 下编译的应用程序,并且我想在不让用户安装 cygwin 的情况下分发该应用程序。打包可执行文件和 cygwin DLL 就足够了吗? 最佳答案 事情发生了变化。 Cygw
我从一个镜像站点下载了 cygwin,几个月后,当我尝试更新时,我收到一条消息:“当前 ini 文件来自较新版本的 setup-x86_64.exe” 如果我下载了新的 ini 文件,是否也意味着必须
有什么办法可以回去安装旧版本的 Cygwin? 说我想要 1.7.9 版本,但是 setup.exe在 Cygwin 网站上总是指向最新版本? 最佳答案 http://www.cygwin.com/s
我试图从我的C++代码运行这两个.data文件进行分配。我已经获得了所有文件,并且仅打算为程序实现一些功能(所有内容都应能够运行make命令进行编译)。 我曾经运行过MAC,只是刚开始使用Window
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
当我尝试对CVS管理的文件使用Emacs 23.2.1下的ediff-revision时,在*ediff-errors*框架中收到以下错误,而不是直接开始到ediff结果: cygwin warnin
我一直在用 Cygwin (许久)。具体来说,我在Win7上使用它(包括gcc/g++)进行开发工作。我最近才注意到现在存在一个 64-bit version . 我没有特定的需求要求我过渡到 64
我从安装程序 2.905 安装了 cygwin 3.1.7 64 位,如果我不使用 grep --color=always 我在终端中看不到彩色输出,即 grep - -color=auto 在我的终
如何使用 cygwin 挂载软盘镜像文件。我想挂载镜像,将文件复制到挂载的驱动器,然后从命令行卸载它。 我知道你可以使用 Virtual Floppy Drive在 Windows 中,但有没有办法在
这个question说明cygwin的软链接(soft link)和ntfs的junctions有些不同。我希望 cygwin 创建一个真正的连接点。我想过运行mklink但是,见鬼,没有mklink
我想设置一组最小的 cygwin 应用程序(ls、diff、path、find、grep),以便它们在没有完整 cygwin 安装的机器上运行。 我假设我需要的只是相关的 *.exe 文件和 *.dl
我的机器设置可以运行 cmake 和 gcc,我想在构建机器上安装具有完全相同的包和参数集的 cygwin,也可能在其他开发机器上。有没有一种方法可以做到这一点,而不必使用提供的 Setup.exe
我正在尝试使用 Cygwin 运行 Nutch。我在设置 JAVA_HOME 时遇到问题。 $ export JAVA_HOME='/cygdrive/f/program files/java/jd
如果您尝试“全局”安装 Composer,则它无法在 Cygwin 中正确运行。 将 composer.phar 放入/usr/local/bin/composer 中,然后尝试运行它会导致错误: C
要为 Cygwin 安装其他软件包,我是否只需要运行 setup.exe再次从包列表中选择? 此外,就安装 2 个 Cygwin 实例或此类问题而言,这样做不会损害我的计算机(我对这些事情有点菜鸟)。
我刚刚安装了 Cygwin,bash 提示符中的主目录看起来位于我的 Z: 驱动器上。这不是我想要的。 如何更改此设置? 最佳答案 Starting with Cygwin 1.7.34 ,建议的方法
cygwin 上的当前目录是 home/myuser。我导航到 cygwin,发现它有一个名为 home/myuser 的目录,我不知道如何导航到桌面。我不想在那里添加桌面目录,而且我无法在根文件夹
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我使用当前版本的 Cygwin,1.7.9-1。 当我输入“$ which python”时,Cygwin 输出“/usr/bin/python”。 为了确认根目录是我的 Windows 7 文件系统
我想在 Windows 中使用 cmd 做类似的事情: start dir c:\ 应打开一个新控制台,并显示 dir c: 的输出。 对于 Cygwin 我尝试了这个: cmd /c start b
我是一名优秀的程序员,十分优秀!