java - 位移位 - 为什么此代码使用 24、16 和 8 位右移?
问题描述
我正在查看这个 java 代码并试图理解它。除了位移部分,我了解它的一切。
我知道下面使用位移的代码正在构建一些值来填充字节 [] 但我不知道为什么它专门使用右位移以及为什么 24、16、8 位?在哪里以及为什么选择这些值而不是其他一些值?
private void Send(NetSocket out, int MsgID, byte MsgSeq, char MsgLetter, String data)
{
int msglen = data.length() + 2;
byte[] msg = new byte[msglen + 8];
byte[] md = data.getBytes();
msg[0] = (byte) (msglen >> 24);
msg[1] = (byte) (msglen >> 16);
msg[2] = (byte) (msglen >> 8);
msg[3] = (byte) (msglen);
msg[4] = (byte) (MsgID >> 24);
msg[5] = (byte) (MsgID >> 16);
msg[6] = (byte) (MsgID >> 8);
msg[7] = (byte) (MsgID);
msg[8] = (byte) MsgLetter;
msg[9] = MsgSeq;
System.arraycopy(md, 0, msg, 10, msglen - 2);
// send
}
解决方案
这只是将 32 位整数的 4 个字节打包成 4 个连续字节,注意使用特定的字节序(在这种情况下为大字节序)。它只是说:
// put the "biggest" 8 bits into the first byte,
// by right shifting the value 24 bits
msg[0] = (byte) (msglen >> 24);
将 32 位整数右移 24 位意味着您在最低有效 8 位中剩下 8 个最高有效位,准备好打包到byte
. 接下来的 3 行处理接下来的 8 位(右移 16),然后是下一个(右移 8),等等。
转换为 a会byte
简单地丢弃除最低有效 8 位之外的所有内容,因此在每次移位后(或最后一个移位中没有移位),我们取 32 位的四分之一。
再说一遍:这只是实现了帧的大端长度前缀。接收代码将通过左移和 or-ing 反转这一点,从前 4 个字节重建长度。
推荐阅读
- python - 在 python 数据框中访问前几行的最佳方法是什么?
- javascript - JavaScript 的街道地址正则表达式
- graphql - AWS Amplify 基于 db 字段值或关系的授权
- sql - sql:查询以查找带有额外列的最大计数
- python - 通过索引查找和替换 XML 属性 - Python
- python - 有没有办法将 Python 转换为 R?
- ruby-on-rails - Rails 6 无法部署到 Heroku:ModuleNotFoundError:找不到模块:错误:无法解析 '/tmp 中的 '@popperjs/core'
- postman - 从邮递员的外部json数据文件中读取值
- node.js - 如何使用 Node.js SDK 创建 Kubernetes 部署
- jsf - 如何防止 JSF 2.2 接受来自不同会话的 ViewState?