我需要帮助一些我刚收到帮助的代码。基本上,这段代码是用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:表达式无效 - 需要左值。
答案 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(", ");
}
}