gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:24:38 25 4
gpt4 key购买 nike

收到帮助。基本上,这段代码是用 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(", ");
}
}

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

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.

最新更新

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

给了我以下错误:

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.

最佳答案

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

关于java - 使用二进制字节转换代码将C转换为Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com