Java 位解包器与 C 不匹配

标签 java c bit pack

所以我得到了一个 C 程序,我正试图通过将其转换为 Java 来使其更具可移植性,该程序进展顺利。但是,我遇到了一点挂断,我认为这在于这段代码。它只是一个解包 30 字节帧的函数。我有一种感觉,我遇到了变量类型的问题,试图找出最好的方法来为一些不从 C 继承的 Java 类型创建子类。如果有人看到问题出在哪里,我将不胜感激。

Java:

public static byte[] unPackBits(byte[] Src, int bitOffset, byte[] Dst, int bitCount){

    int srcByteOffset, srcBit;
    int dstByteOffset, dstBit;
    char dstMask, srcMask;

    srcByteOffset = bitOffset / 8;
    srcBit = bitOffset % 8;
    srcMask = (char)(0x01<<srcBit);

    dstByteOffset = 0;
    dstBit = 0;
    dstMask = 0x01;

    Dst[dstByteOffset] = '\0';

    for(int b = 0; b < bitCount; b++){
        if((Src[srcByteOffset] & srcMask) != (char)0x00){
            Dst[dstByteOffset] = (byte)(Dst[dstByteOffset]|dstMask);
        }
        else {
            Dst[dstByteOffset] = (byte)(Dst[dstByteOffset] & (~dstMask));
        }

        srcBit++;
        if(srcBit < 8) {
            srcMask = (char)(srcMask<<1);
        }
        else {
            srcByteOffset++;
            srcBit = 0;
            srcMask = 0x01;
        }

        dstBit++;
        if(dstBit < 8) {
            dstMask = (char)(dstMask<<1);
        }
        else {
            dstByteOffset++;
            dstMask = 0x01;
            dstBit = 0;
        }
    }
    return Dst;
}

C:

void TRB::unPackBits(char *Src, int BitOffset, char *Dst, int BitCount) {
   int srcByteOffset, srcBit;
   int dstByteOffset, dstBit;
   char dstMask, srcMask;

   srcByteOffset   = BitOffset / 8;
   srcBit          = BitOffset % 8;
   srcMask = 0x01<<srcBit;

   dstByteOffset = 0;
   dstBit  = 0;
   dstMask = 0x01;
   Dst[dstByteOffset] = '\0';


   for(int b = 0; b < BitCount; b++) {
      if((Src[srcByteOffset] & srcMask) != (char)0x00) {
         Dst[dstByteOffset] = Dst[dstByteOffset] | dstMask;
      }
      else {
         Dst[dstByteOffset] = Dst[dstByteOffset] & (~dstMask);
      }

      srcBit++;
      if(srcBit < 8) {
         srcMask = srcMask<<1;
      }
      else {
         srcByteOffset++;
         srcBit = 0;
         srcMask = 0x01;
      }

      dstBit++;
      if(dstBit < 8) {
         dstMask = dstMask<<1;
      }
      else {
         dstByteOffset++;
         dstMask = 0x01;
         dstBit = 0;
      }
   }

}

最佳答案

您很可能偶然发现了 endianness 的一个非常常见的问题. C 和 java 可能有不同的表示 int 的方式,这取决于运行 c 代码的机器的体系结构。

通常 C 程序应该将多字节整数转换为 network byte order像您现在所做的那样简化可移植性工作。

要获得正确的字节顺序,您必须使用 bit-shift 来改变您的位。和“和”运算符。

也很感兴趣 - nio package具有轻松处理通常由遗留 c 代码生成的 LSB 字节顺序整数的功能。

关于Java 位解包器与 C 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6445272/

相关文章:

java - PublishSubject 在订阅时触发 onNext

c - 交换字符位并在交换后将其替换为新创建的字符

c# - 在 C# 中存储长二进制文件(最多 512 位)的最佳方法

java - 异构数组列表

java - 未捕获或未抛出预期异常?

java - 通过管道发送对象

c - 当结构未正确对齐时,如何访问结构的成员?

在C中转换和显示图像

c - 在 C 中实现求和公式

c++ - 求解位方程