【发布时间】:2022-04-25 18:42:16
【问题描述】:
为了解析非托管数据的二进制流,我必须重新创建数据类型。数据被压缩,这意味着我读取了 2 个字节,它们实际上代表一个 6 位 byte 值和一个 10 位 short 值。
我需要做的就是将一个位序列从一个值复制到另一个值。我知道源值和目标值的起始位和长度。到目前为止,我已经提出了两种方法,它们都复制了正确的位,但不知何故以相反的顺序。
byte BitwiseCopy(short value, int sourceStartBit, int destStartBit, int bitCount)
{
short result = 0;
for (int i = 0; i < bitCount; i++)
//result |= (byte) (value & (1 << sourceStartBit + i) | (result & (1 << (destStartBit + bitCount) - i)));
result |= (short) (value & (1 << sourceStartBit + i));
return (byte) (result >> ((destStartBit - bitCount) + sizeof(byte) * 8));
}
对于我的测试场景,我使用的是具有以下值的 short:
0000 0000 1101 0011
^15 ^0
我的目标是将这个短的 4-th - 7-th 位复制到一个字节的 0-3rd 位。
当我使用注释行(没有返回子句中的代码)方法或当前突出显示的方式时,我总是得到这个结果:
0000 1011
^7 ^0
所以我想要的,只是颠倒了。我敢肯定它很小,但我在这里俯瞰什么?我不明白为什么它会颠倒顺序。移位方法(直接按位复制并将其移动到正确的位置)不应该颠倒它,不是吗?
编辑:
always 方法有一个short 类型的输入。我有 3 个参数: sourceStart 这是我开始从输入值(低到高)复制的位,destStart 这是我复制到目标的位(这是字节或短 - 我会为此制定两种特定方法)和 bitCount 这是我要复制的位数(从低位到高位)。
该方法必须以正确的顺序复制位。因此,例如CopyBitwise(input, 4, 0, 4) 应该返回(左:高,右:低顺序)0000 1011 给定这个输入:
input [short]: ... 1011 0110
^8th ^0th
另一个:
input [short]: 1011 0110 0100 0111
^15th ^0th
^end ^start
CopyBitwise(input, 7, 3, 5) 应该会导致
0011 0000
^8th ^0th
^end ^start
【问题讨论】:
-
您的输入到底是什么,您的预期输出到底是什么?
-
输入总是一个短的,我必须分成一个字节和另一个短值。我想要一个通用方法,它从输入中获取从 sourceStart 开始的 n 个字节,并将其复制到 destStart 处的目标字节/短相同的顺序。
-
您应该清楚地列出给定输入值的输出字节和短字节应该是什么。我也还不清楚。添加更多示例以避免混淆。
-
你的代码没有帮助解释,这不应该需要for循环。
-
'非托管数据'不是真实的。文件中的字节序是这里的一个主要问题。清楚地表明你是如何阅读这篇文章的(阅读
short或byte[2]是不一样的)。
标签: c# bitwise-operators bit-shift