0

我需要一些我刚刚收到帮助的代码的帮助。基本上,这段代码是用 Java 编写的,但我也需要它能够在 C 中工作。我已经测试过代码并且工作正常。它本质上讲一个二进制字符串并将其放入一个字节数组中,每个位置包含 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:只能索引 cofunctions。
第 1 行:错误 UNTITLED2.C:旧式函数声明缺少参数声明列表。第 1 行:ERROR UNTITLED2.C:',' 缺失/预期。
第 6 行:错误 UNTITLED2.C:需要常量表达式。
第 10 行:错误 UNTITLED2.C:无效的表达式。
第 10 行:错误 UNTITLED2.C:缺少字符 ';'。
第 10 行:错误 UNTITLED2.C:缺少字符 ';'。
第 10 行:错误 UNTITLED2.C:缺少字符 ')'。
第 10 行:错误 UNTITLED2.C:缺少字符 ')'。
第 10 行:错误 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 行:错误 UNTITLED3.C:不允许分配给只读变量。第 4 行:ERROR UNTITLED3.C:关键字“const”只能用于全局变量和静态局部变量。第 7 行:警告 UNTITLED3.C:转换为不兼容的指针类型第 7 行:警告 UNTITLED3.C:转换为不兼容的指针类型第 7 行:警告 UNTITLED3.C:转换为不兼容的指针类型第 15 行:警告 UNTITLED3.C:类型不匹配:表达式中使用的不兼容类型 char[] 和 unsigned int。第 15 行:错误 UNTITLED3.C:无效的表达式 - 需要左值。
第 15 行:错误 UNTITLED3.C:s 超出范围/未声明。
第 15 行:错误 UNTITLED3.C:缺少字符 ';
第 15 行:错误 UNTITLED3.C:字符串超出范围/未声明。第 16 行:警告 UNTITLED3.C:转换为不兼容的指针类型第 16 行:警告 UNTITLED3.C:参数 1 的类型错误。
第 16 行:错误 UNTITLED3.C:s 超出范围/未声明。
第 16 行:错误 UNTITLED3.C:DynamicC 不支持数组分配。第 16 行:错误 UNTITLED3.C:无效的表达式 - 需要左值。

4

2 回答 2

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) 无符号(以避免符号扩展)和 b) 分配为静态的,因此它不会在函数之外消失。

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

#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) 没有原型c) 没有在您的函数中fromBinary()声明或分配。你也不应该用返回类型声明。如果您在上面的代码中遇到错误,那么要么您没有使用真正的 C 编译器,要么它已损坏。我建议阅读或重新阅读有关 C 编程语言的基础书籍。Kelley 和 Pohl 的“A Book on C”是一个好的开始。toReturnmain()main()void

于 2012-07-17T20:44:17.673 回答
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(", ");
    }
}
于 2012-07-18T00:38:49.610 回答