- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须传输一些值以用作网络上的命令,我希望它尽可能高效和健壮,即我需要关于这些命令的用途的意见, #defines 还是枚举?
命令范围不得超过 20 个命令(假设每个定义的命令响应为 40 个),因此根据我所听到的大多数情况,它很适合字符限制。
到目前为止,我假设最好的方法是使用枚举。
最佳答案
在互联网上传输数值时,您需要牢记两点。
首先是字节顺序,即字节(有时是位)出现的顺序。假设您有 32 位值 0xAABBCCDD。 Intel CPU 是小端机器,这意味着这些字节将存储为 { 0xDD, 0xCC, 0xBB, 0xAA }。换句话说,最低有效字节存储在最低地址。在大端机器中,字节将存储为 { 0xAA, 0xBB, 0xCC, 0xDD },最低有效字节位于最高地址。
在两台机器之间传输多字节整数时,您必须确保它们都能正确解释彼此的数据,即使它们的字节顺序不同。值得庆幸的是,有一个称为网络字节顺序的标准,它是 big-endian,并且有 4 个有用的函数可以在主机顺序和网络顺序之间进行转换:
ntohl (Network to Host, long)
ntohs (Network to host, short)
htonl (Host to network, long)
htons (Host to network, short)
长版本使用 32 位整数,短版本使用 16 位整数。只要您总是在通过网络传输数据之前调用 *hton** 并在从网络读取数据时调用 *ntoh** ,数据就会以正确的字节顺序排列。
当然,解决此问题的最简单方法,尤其是因为您只有 20 个命令,就是只使用单个字节或 char。
您必须处理的第二个问题是编码。有符号整数是如何表示的?使用符号位?补码?同样,当网络上的不同平台使用不同的表示时,您会遇到问题。如果您坚持使用无符号类型,那么您真的应该没有问题。
在程序中使用什么来表示命令完全取决于您。只需确保您定义好协议(protocol)并在传输和读取数据时遵守该协议(protocol)即可。
例如:
enum command_t { one, two, three }
void send_command(command_t c) {
send((unsigned char)c);
}
command_t read_command() {
return (command_t)recv();
}
void send(unsigned char c) { ... }
unsigned char recv() { ... }
关于c - 我应该对网络命令使用#defines 还是枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1113943/
我是一名优秀的程序员,十分优秀!