在发送端的发送的是类似如下一个结构:
struct{
int id;
char title[50]
int type;
};在java中如何读取类似的结构,并把它构造成一个类似以下的类:
class TestStruct{
int id;
String title;
int type;
};
struct{
int id;
char title[50]
int type;
};在java中如何读取类似的结构,并把它构造成一个类似以下的类:
class TestStruct{
int id;
String title;
int type;
};
解决方案 »
- Java读取数据库图片
- 构造函数
- Type safety: The method add(Object) belongs to the raw type List. References to generic type must be parameterized
- System.in.println( " You can press return to quit\n" );什么意思?
- Tomcat的配置啊!!!怎么会不行的啊!
- 编译能通过,运行时提示java.lang.VerifyError怎么办
- 关于打开的游标超出最大数问题
- 大家快来看!!!!!----我找到了Visualage for java 3.0的下载地点!!!!!!!
- 请教Java SWING开发高手一个写齐了全部实验项目源代码的“IM系统通信实验生成窗口显示不正常”的调试方法是什么?
- 急,在线求解答
- 困扰多是的加密问题。如果把密钥导入异构系统中。
- 感谢昨天为我答题的朋友,特来散分,关于按钮弹出问题的!看到就进来留个言,马上给分
socket.getInputStream().read( buf );TestStruct test = new TestStruct();
test.id = (buf[0]&0xFF) | ((buf[1]&0xFF) << 8) | ((buf[2]&0xFF) << 16) | ((buf[3]&0xFF) << 24);
test.title = new String( buf, 4, 50 );
test.type = (buf[54]&0xFF) | ((buf[55]&0xFF) << 8) | ((buf[56]&0xFF) << 16) | ((buf[57]&0xFF) << 24);
什么啊.看了就头大啊.
---------------------------------------
呵呵,小朋友当然看不懂了!
可以用ASN.1
直接在不同语言中传送对象 结构数据等了
我认同那个没有读过高中的人的建议。但是很好的适应性。其实让C++照顾一下Java的理解能力比较好,不要搞结构。
然后用Axis就接受,就一马平川了。
顺便提一下,leehq(没有读过高中的人) 老兄的方法中,test.title = new String( buf, 4, 50 ); 有点问题,C++ 中的字符串是 null-terminated,并不一定是 50 个字节长。
-----------------------------------------------------------------
你没看这个结构吗,怎么不是50个字长?
struct{
int id;
char title[50]
int type;
};
> struct{
> int id;
> char title[50]
> int type;
> };你误会我的意思了,我不是说这个结构里的字节数。这是一个有 50 字节的 char 数组,在 C/C++ 里能够表示一个不超过 49 字节的字符串。当你在 Java 中创建一个等价的字符串的时候,首先需要判断实际的字符串长度(按照 C/C++ 的语法,也就是 null-terminated),然后再去 new String(),而不应该直接 test.title = new String( buf, 4, 50 );
大家没有遇到C结构体里面存在int[]德情况吧,想一想遇到这样的情况该如何处理呢?
--------------------------------------------------------------------------------
要看数组的长度,如果是int[4],那么长度就是4*sizeof(int)。maquan('ma:kju)
你误会我的意思了,我不是说这个结构里的字节数。这是一个有 50 字节的 char 数组,在 C/C++ 里能够表示一个不超过 49 字节的字符串。当你在 Java 中创建一个等价的字符串的时候,首先需要判断实际的字符串长度(按照 C/C++ 的语法,也就是 null-terminated),然后再去 new String(),而不应该直接 test.title = new String( buf, 4, 50 );
----------------------------------------------------------------------------------
你说得不错,但我只是简单示范一下而已,具体的实现当然要变通一下了。
呵呵
例子 double
long l; l = b[0];
l &= 0xff;
l |= ((long) b[1] << 8);
l &= 0xffff;
l |= ((long) b[2] << 16);
l &= 0xffffff;
l |= ((long) b[3] << 24);
l &= 0xffffffffl;
l |= ((long) b[4] << 32);
l &= 0xffffffffffl; l |= ((long) b[5] << 40);
l &= 0xffffffffffffl;
l |= ((long) b[6] << 48); l |= ((long) b[7] << 56);
return Double.longBitsToDouble(l);
//发送获取资源列表的命令
Log.log("\n 开始发送获取资源列表的命令:-----------------\n");
outData.write(strHead.getBytes());
outData.writeByte(version);
outData.writeInt(reverseByte_32(serial));
outData.writeShort(reverseByte_16(type));
outData.writeShort(reverseByte_16(sub_type));
outData.writeInt(reverseByte_32(len));
outData.writeInt(reverseByte_32(result));
outData.writeLong(reverseByte_32(timeout)); //接收返回信息
Log.log("\n 开始接收~获取资源列表~返回信息:-----------------\n");
byte head[] = new byte[16];
inData.read(head);
String strHead_b = new String(head, "GB2312"); byte version_b = inData.readByte();
int serial_b = reverseByte_32(inData.readInt());
short type_b = reverseByte_16(inData.readShort());
short sub_type_b = reverseByte_16(inData.readShort());
int len_b = reverseByte_32(inData.readInt());
int result_b = reverseByte_32(inData.readInt());....
.....=======================================================//java的16BIT的数据格式转换为C语言的数据格式。
public static short reverseByte_16(int param) throws Exception {
String order = SysConfig.loadSysConfig("System.byteOrder");
if (order.equals("1")) { //高字节序传送数据,无须任何转换
return (short) param;
}
int r1 = param & 0x000000ff;
r1 <<= 8;
param >>= 8;
int r2 = 0x0000ffff & param;
short result = (short) (r1 | r2);
return result;
}//java的32BIT的数据格式转换为C语言的数据格式。
public static int reverseByte_32(int param) throws Exception {
String order = SysConfig.loadSysConfig("System.byteOrder");
if (order.equals("1")) { //高字节序传送数据,无须任何转换
return param;
}
int r4 = param & 0x000000ff;
r4 <<= 24;
int r3 = param & 0x0000ff00;
r3 <<= 8;
param >>= 8;
int r2 = param & 0x0000ff00;
param >>= 16;
int r1 = 0x000000ff & param;
int result = (int) (r4 | r3 | r2 | r1);
return result;
}