Convert C to Java with binary byte conversion code

I need a little help with the some code that I just received help with. Basically, this code is written in Java but I need it to be able to work in C as well. I have tested the code already and it works fine. It essentially talkes a binary sting and places it into a byte array with each place holding 8 characters (1's and 0's). I do know a few variables that will never change and have listed them below:

Byte.SIZE is always 8

sLen is always 64

len is always 8

I have included the java code and my attempt to make the conversion. However, my code consistantly has run time errors and other syntax problems. I was wondering if anyone could find my issue:

Java code

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 code

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;
}

Ok sorry, so to begin I am relatively new to C. I have been programming in Java for a few years so I am not vey accustomed to the errors and syntax of C. I am using Dynamic C as the programming environment so error messages may be different. I used the following main to run my program:

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

I have been unable to run my program due to the following errors:

line 1 : ERROR UNTITLED2.C : Only cofunctions can be indexed. line 1 : ERROR UNTITLED2.C : Old style function declaration missing parameter declaration list. line 1 : ERROR UNTITLED2.C : ',' is missing/expected. line 6 : ERROR UNTITLED2.C : Constant expression expected. line 10 : ERROR UNTITLED2.C : Invalid expression. line 10 : ERROR UNTITLED2.C : Missing character ';'. line 10 : ERROR UNTITLED2.C : Missing character ';'. line 10 : ERROR UNTITLED2.C : Missing character ')'. line 10 : ERROR UNTITLED2.C : Missing character ')'. line 10 : ERROR UNTITLED2.C : Invalid expression. line 10 : WARNING UNTITLED2.C : Conversion to incompatible pointer type line 19 : WARNING UNTITLED2.C : Type mismatch: incompatible types char[] and unsigned int used in expression. 10 errors reached; further errors suppressed.

I am not sure what I am doing wrong. Any insight is appreciated. Sorry about all the confusion.

Newest update

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(", ");
    }
}

gave me the following errors:

line 1 : ERROR UNTITLED3.C : Keyword 'const' can only be used with globals and static locals. line 4 : ERROR UNTITLED3.C : Assignment to read-only variable not allowed. line 4 : ERROR UNTITLED3.C : Keyword 'const' can only be used with globals and static locals. line 7 : WARNING UNTITLED3.C : Conversion to incompatible pointer type line 7 : WARNING UNTITLED3.C : Conversion to incompatible pointer type line 7 : WARNING UNTITLED3.C : Conversion to incompatible pointer type line 15 : WARNING UNTITLED3.C : Type mismatch: incompatible types char[] and unsigned int used in expression. line 15 : ERROR UNTITLED3.C : Invalid expression - need lvalue. line 15 : ERROR UNTITLED3.C : s is out of scope/ not declared. line 15 : ERROR UNTITLED3.C : Missing character ';'. line 15 : ERROR UNTITLED3.C : string is out of scope/ not declared. line 16 : WARNING UNTITLED3.C : Conversion to incompatible pointer type line 16 : WARNING UNTITLED3.C : Wrong type for parameter 1. line 16 : ERROR UNTITLED3.C : s is out of scope/ not declared. line 16 : ERROR UNTITLED3.C : DynamicC does not support array assignment. line 16 : ERROR UNTITLED3.C : Invalid expression - need lvalue.

Answers


Just from the looks of it your C code is going to explode horribly (even if it were syntactically valid, which it is not). You're returning toReturn which is allocated on the stack so it goes out of scope the moment the function returns. This is almost certainly going to cause segmentation violations and the like. Instead of trying to translate Java, why not just write it in C from scratch.

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;
}

Note the array returned is a) unsigned (to avoid sign extension) and b) allocated as static so it won't go away outside the function.

UPDATE: this is a complete test harness for the above function:

#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)
}

This compiles without errors or warnings using gcc. It returns 29 35 36 DE B2 05 D2 49. In your code you are a) not declaring any header files b) not prototyping fromBinary() c) not declaring or assigning toReturn in your main() function. You should also never declare main() with void return type. If you get errors with the above code then either you are not using a real C compiler or it is broken. I suggest reading or re-reading a basic book on the C programming language. Kelley and Pohl's 'A Book on C' is a good start.


I fixed , try this:

#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(", ");
    }
}

Need Your Help

Bootstrap 3 Collapsible Navbar Text and Links Not Aligning

html css twitter-bootstrap twitter-bootstrap-3 navbar

I'm having trouble keeping text tagged with class="navbar-text" in line with other links in the navbar. Building off of the Bootstrap 3 example for a fixed top navbar, I noticed that any time the b...

How to interpret my ShowPlan(Execution Plan)

sql database ms-access sql-execution-plan

I have an Access 2003 DB and I want to improve its performance. Yesterday, I read an article about Execution Plan (Show Plan) and today I ran my show Plan for this query: