使用二进制字节转换代码将C转换为Java

时间:2012-07-17 20:12:46

标签: java c binary byte

我需要帮助一些我刚收到帮助的代码。基本上,这段代码是用Java编写的,但我需要它才能在C语言中工作。我已经测试了代码,它工作正常。它本质上是一个二进制sting并将它放入一个字节数组中,每个地方都有8个字符(1和0)。我知道一些永远不会改变的变量,并在下面列出了这些变量:

Byte.SIZE总是8

sLen总是64

len总是8

我已经包含了java代码和我尝试进行转换。但是,我的代码一直存在运行时错误和其他语法问题。我想知道是否有人能找到我的问题:

Java代码

static byte[] fromBinary(String s) {
    int sLen = s.length(), len = sLen / Byte.SIZE;
    if (sLen % Byte.SIZE != 0) {
        len++;
    }
    byte[] toReturn = new byte[len];
    for (int i = 0; i < sLen; i++) {
        if (s.charAt(i) == '1') {
            toReturn[i / Byte.SIZE] = (byte) (toReturn[i / Byte.SIZE] | (0x80 >>> (i % Byte.SIZE)));
        }
    }

    return toReturn;
}

C代码

char fromBinary [] (String s) {
    int sLen =64;
    int len=8;
    int i=0;
    char toReturn [8];
    char str [64]=s;

    for (i = 0; i < sLen; i++) {
        if (str[i] == '1') {
            toReturn[i/8] = (char)(toReturn[i/8] | (0x80 >>> (i%8)));
        }
    }

    return toReturn;
}

好对不起,所以开始我对C相对较新。我已经用Java编程了几年,所以我不习惯C的错误和语法。我使用Dynamic C作为编程环境所以错误消息可能不同。 我使用以下main来运行我的程序:

void main()  {
char bytes [8];
string s ="1010110011011110010010000010001101000101011001111010101111001101";
bytes=fromBinary(s);
 for (j=0;j<8;j++){
    printf("%d",toReturn[j]);
    printf(", ");
    }
}

由于以下错误,我无法运行我的程序:

第1行:ERROR UNTITLED2.C:只能对联合功能进行索引 第1行:ERROR UNTITLED2.C:旧样式函数声明缺少参数声明列表。 第1行:ERROR UNTITLED2.C:','缺失/预期。
第6行:ERROR UNTITLED2.C:预期的常量表达。
第10行:ERROR UNTITLED2.C:表达式无效。
第10行:ERROR UNTITLED2.C:缺少字符';' 第10行:ERROR UNTITLED2.C:缺少字符';' 第10行:ERROR UNTITLED2.C:缺少字符')' 第10行:ERROR UNTITLED2.C:缺少字符')' 第10行:ERROR UNTITLED2.C:表达式无效。
第10行:警告UNTITLED2.C:转换为不兼容的指针类型 第19行:警告UNTITLED2.C:类型不匹配:表达式中使用的不兼容类型char []和unsigned int。 达到10个错误;进一步的错误受到抑制。

我不确定我做错了什么。任何见解都表示赞赏。抱歉所有的困惑。

最新更新

unsigned char *fromBinary(const char * const s) {
static unsigned char toReturn[8]={0};
size_t i,j;
const size_t len=8;
 for(i=0;i<len;i++)        {
    for(j=0;j<8;j++)
       toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
    }
return toReturn;
 }

 void main()  {
 unsigned char bytes [8];
 string s ="1010110011011110010010000010001101000101011001111010101111001101";
 fromBinary(s)
 for (j=0;j<8;j++){
    printf("%d",toReturn[j]);
     printf(", ");
    }
}

给了我以下错误:

第1行:ERROR UNTITLED3.C:关键字'const'只能与全局变量和静态局部变量一起使用。 第4行:ERROR UNTITLED3.C:不允许分配给只读变量。 第4行:ERROR UNTITLED3.C:关键字'const'只能与全局变量和静态局部变量一起使用。 第7行:警告UNTITLED3.C:转换为不兼容的指针类型 第7行:警告UNTITLED3.C:转换为不兼容的指针类型 第7行:警告UNTITLED3.C:转换为不兼容的指针类型 第15行:警告UNTITLED3.C:类型不匹配:表达式中使用的不兼容类型char []和unsigned int。 第15行:ERROR UNTITLED3.C:表达式无效 - 需要左值。
第15行:ERROR UNTITLED3.C:s超出范围/未声明。
第15行:ERROR UNTITLED3.C:缺少字符';' 第15行:错误UNTITLED3.C:字符串超出范围/未声明。 第16行:警告UNTITLED3.C:转换为不兼容的指针类型 第16行:警告UNTITLED3.C:参数1的类型错误。
第16行:ERROR UNTITLED3.C:s超出范围/未声明 第16行:ERROR UNTITLED3.C:DynamicC不支持数组赋值。 第16行:ERROR UNTITLED3.C:表达式无效 - 需要左值。

2 个答案:

答案 0 :(得分:2)

从它的外观来看,你的C代码将会爆炸性地爆炸(即使它在语法上是有效的,但事实并非如此)。您将返回在堆栈上分配的toReturn,因此在函数返回时它将超出范围。这几乎肯定会导致分段违规等。而不是试图翻译Java,为什么不从头开始用C语言编写它。

unsigned char *fromBinary(const char * const s)
{
   static unsigned char toReturn[8]={0};
   size_t i,j;
   const size_t len=8;

   for(i=0;i<len;i++)
       {
       toReturn[i]=0;
       for(j=0;j<8;j++)
          toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
       }
   return toReturn;
}

注意返回的数组是a)unsigned(以避免符号扩展)和b)分配为static,因此它不会在函数外部消失。

更新:这是上述功能的完整测试工具:

#include <stdio.h>

unsigned char *fromBinary(const char * const s);

int main(void)
{
   const char *const s="0010100100110101001101101101111010110010000001011101001001001001";
   unsigned char *b;
   b=fromBinary(s);
   printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
   return 0;
}

unsigned char *fromBinary(const char * const s)
{
(as above)
}

使用gcc编译时没有错误或警告。它返回29 35 36 DE B2 05 D2 49。在您的代码中,您是a)未声明任何头文件b)未进行原型设计fromBinary() c)未在toReturn函数中声明或分配main()。您也不应该使用main()返回类型声明void。如果您使用上面的代码出错,那么要么您没有使用真正的C编译器,要么它已被破坏。我建议阅读或重读一本关于C编程语言的基础书。 Kelley和Pohl的“A Book on C”是一个良好的开端。

答案 1 :(得分:0)

我修好了,试试这个:

#include <stdio.h>

typedef char* string;

unsigned char* fromBinary(const char * const s) {
    static unsigned char toReturn[8]={0};
    size_t i,j;
    const size_t len=8;
    for(i=0;i<len;i++){
        for(j=0;j<8;j++)
            toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
    }
    return toReturn;
 }

int main()  {
    unsigned char (*bytes)[8];
    string s ="1010110011011110010010000010001101000101011001111010101111001101";
    int j;

    bytes=(unsigned char (*)[8])fromBinary(s);
    for (j=0;j<8;j++){
        //printf("%02X",(*bytes)[j]);
        printf("%d",(*bytes)[j]);
        printf(", ");
    }
}