‘壹’ python socket recv 到的一个数据包中有 print repr出来有16进的有正常的字符串
struct包里面有pack和unpack,字符串之间可以用+连接起来。
‘贰’ 请问通过netty或者socket怎么接收16进制的字节码
socket接收的本来就是byte数组,直接处理byte数组就好。一般原始的socket代码都是用byte的。只有外界一些简化的代码,才会直接把byte数组转换成字符再处理。
不过唯一的问题是,你这样没有tcp头的数据。容易发生tcp拆包。
‘叁’ 求教各位大仙socket如何发送16进制数据
我们定义发送者和接收者,发送者作为客户端,接收者作为服务端。
Sender.java
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.Socket;
importjava.util.Arrays;
publicclassSender{
publicstaticvoidmain(String[]args)throwsException{
//127.0.0.1代表本机地址,在8888端口上监听
Sendersender=newSender("127.0.0.1",8888);
byte[]bytes={15,16,17,120};//对应的十六进制是0F101178
sender.send(bytes);
System.out.println("发送"+Arrays.toString(bytes)+"完毕!");
}
privatefinalStringhost;
privatefinalintport;
publicSender(Stringhost,intport){
this.host=host;
this.port=port;
}
privatevoidsend(byte[]bytes)throwsIOException{
Socketsocket=newSocket(host,port);//建立和服务端的socket
try(DataOutputStreamdos//建立输出流
=newDataOutputStream(socket.getOutputStream())){
dos.write(bytes,0,bytes.length);//向输出流写入bytes
}
}
}
importjava.io.DataInputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassReceiver{
publicstaticvoidmain(String[]args)throwsException{
Receiverreceiver=newReceiver(8888);
receiver.receive();
}
;
publicReceiver(intport)throwsIOException{
serverSocket=newServerSocket(port);
}
privatevoidreceive()throwsIOException{
System.out.println("等待客户端连接...");
Socketsocket=serverSocket.accept();
try(DataInputStreamdis=newDataInputStream(socket.getInputStream())){
byte[]bytes=newbyte[1024];//假设发送的字节数不超过1024个
intsize=dis.read(bytes);//size是读取到的字节数
Stringhex=bytesToHex(bytes,0,size);
System.out.println("接收到的byte数组的十六进制:"+hex);
}
}
/**
*将byte数组转化为十六进制字符串
*
*@parambytesbyte[]数组
*@parambegin起始位置
*@paramend结束位置
*@returnbyte数组的十六进制字符串表示
*/
privateStringbytesToHex(byte[]bytes,intbegin,intend){
StringBuilderhexBuilder=newStringBuilder(2*(end-begin));
for(inti=begin;i<end;i++){
hexBuilder.append(Character.forDigit((bytes[i]&0xF0)>>4,16));//转化高四位
hexBuilder.append(Character.forDigit((bytes[i]&0x0F),16));//转化低四位
hexBuilder.append('');//加一个空格将每个字节分隔开
}
returnhexBuilder.toString().toUpperCase();
}
}
‘肆’ java的socket通信如何直接接收16进制数据
发送消息之前转码为16进制
Java code
public static final String encodeHex(String msg) {
byte[] bytes = null;
try {
bytes = msg.getBytes("GBK");
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
StringBuffer buff = new StringBuffer(bytes.length * 4);
String b;
char a;
int n = 0;
int m = 0;
for (int i = 0; i < bytes.length; i++) {
b = Integer.toHexString(bytes[i]);
if (bytes[i] > 0) {
buff.append("00");
buff.append(b);
n = n + 1;
} else {
a = msg.charAt((i - n) / 2 + n);
m = a;
b = Integer.toHexString(m);
buff.append(b.substring(0, 4));
i = i + 1;
}
}
return buff.toString();
}
‘伍’ python中想要把字母或数字转为16进制\x30格式并且输出,但是最终显示却还是字母是怎么回事呢
给你一个函数试试。
def str_to_hex(s):
return ' '.join([hex(ord(c)).replace('0x', '') for c in s])
‘陆’ 请教用socket如何向服务器端发送16进制数据
我们定义发送者和接收者,发送者作为客户端,接收者作为服务端。
Sender.java
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.Socket;
importjava.util.Arrays;
publicclassSender{
publicstaticvoidmain(String[]args)throwsException{
//127.0.0.1代表本机地址,在8888端口上监听
Sendersender=newSender("127.0.0.1",8888);
byte[]bytes={15,16,17,120};//对应的十六进制是0F101178
sender.send(bytes);
System.out.println("发送"+Arrays.toString(bytes)+"完毕!");
}
privatefinalStringhost;
privatefinalintport;
publicSender(Stringhost,intport){
this.host=host;
this.port=port;
}
privatevoidsend(byte[]bytes)throwsIOException{
Socketsocket=newSocket(host,port);//建立和服务端的socket
try(DataOutputStreamdos//建立输出流
=newDataOutputStream(socket.getOutputStream())){
dos.write(bytes,0,bytes.length);//向输出流写入bytes
}
}
}
importjava.io.DataInputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassReceiver{
publicstaticvoidmain(String[]args)throwsException{
Receiverreceiver=newReceiver(8888);
receiver.receive();
}
;
publicReceiver(intport)throwsIOException{
serverSocket=newServerSocket(port);
}
privatevoidreceive()throwsIOException{
System.out.println("等待客户端连接...");
Socketsocket=serverSocket.accept();
try(DataInputStreamdis=newDataInputStream(socket.getInputStream())){
byte[]bytes=newbyte[1024];//假设发送的字节数不超过1024个
intsize=dis.read(bytes);//size是读取到的字节数
Stringhex=bytesToHex(bytes,0,size);
System.out.println("接收到的byte数组的十六进制:"+hex);
}
}
/**
*将byte数组转化为十六进制字符串
*
*@parambytesbyte[]数组
*@parambegin起始位置
*@paramend结束位置
*@returnbyte数组的十六进制字符串表示
*/
privateStringbytesToHex(byte[]bytes,intbegin,intend){
StringBuilderhexBuilder=newStringBuilder(2*(end-begin));
for(inti=begin;i<end;i++){
hexBuilder.append(Character.forDigit((bytes[i]&0xF0)>>4,16));//转化高四位
hexBuilder.append(Character.forDigit((bytes[i]&0x0F),16));//转化低四位
hexBuilder.append('');//加一个空格将每个字节分隔开
}
returnhexBuilder.toString().toUpperCase();
}
}
‘柒’ c socket 16进制接收
printf("***all***%s ",buffer);
你这一句不是表明了你buffer里的内容是字符串么
你确定客服传给你的是字符串么?如果不是,你这么输出当然是乱码
应该这么改
printf("***all***%X ",buffer);