byte[] 到字符串破坏整数
byte[] to string destroying the integers
我创建了一个小的未完成的 Packet Builder class。
AddString()
工作没有问题,但如果我使用 AddInt()
,控制台输出看起来很奇怪。谁能告诉我为什么整数显示不正确?
主要
Packet packet = new Packet();
packet.builder.AddString(Constants.Requests.GET_RESOURCES);
packet.builder.AddString("Another_String");
packet.builder.AddInt(500);
byte[] byteArray = packet.builder.GetByteBuffer();
Console.WriteLine(ByteArrayToString(byteArray));
ByteArray Output: Get_Resources:Another_String:?☺:
47-65-74-5F-52-65-73-6F-75-72-63-65-73-00-3A-41-6E-6F-74-68-65-72-5F-53-74-72-69-6E-67-00-3A-F4-01-00-00-00-3A
如你所见:?☺绝对是错误的。功能都差不多
Class
class Packet
{
public Builder builder;
public Packet()
{
builder = new Builder();
}
private static string ByteArrayToString(byte[] arr)
{
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
return enc.GetString(arr);
}
public static string[] Read(byte[] _recievedData)
{
string data = ByteArrayToString(_recievedData).Trim();
string[] result = data.Split(':');
return result;
}
public class Builder
{
private byte[] buffer;
private int offset;
//Makes very easy on client to filter packets...
private byte[] seperator;
public Builder()
{
offset = 0;
buffer = new byte[4096];
seperator = BitConverter.GetBytes(':');
}
public void AddInt(int intValue)
{
byte[] byteArray = BitConverter.GetBytes(intValue);
for (int x = 0; x < byteArray.Length; x++)
{
buffer[x + offset] = byteArray[x];
}
for (int y = 0; y < seperator.Length; y++)
{
buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
}
offset += (byteArray.Length + seperator.Length);
}
public void AddString(string str)
{
byte[] byteArray = Encoding.ASCII.GetBytes(str);
for (int x = 0; x < byteArray.Length; x++)
{
buffer[x + offset] = byteArray[x];
}
for (int y = 0; y < seperator.Length; y++)
{
buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
}
offset += (byteArray.Length + seperator.Length);
}
public byte[] GetByteBuffer()
{
return buffer;
}
public void Reset()
{
buffer = null;
offset = 0;
}
}
}
您的代码运行良好。可能这不是您想要的,但以下代码将 int 转换为 4 个字节,因为它是一个 32 位整数。
byte[] byteArray = BitConverter.GetBytes(intValue);
在输出的末尾,您会以小端格式 F4-01-00-00
看到这 4 个字节,因为十六进制的 500
是 0x01F4
。这解释了你为什么得到,你得到什么。
现在我假设您期望 500
而不是 ?☺
。以下代码应该会获取您想要的结果:
byte[] byteArray = BitConverter.GetBytes(intValue.ToString());
这将添加数字的字符串表示而不是二进制表示。基于return类型的Read
函数,似乎需要的是字符串表示。
我创建了一个小的未完成的 Packet Builder class。
AddString()
工作没有问题,但如果我使用 AddInt()
,控制台输出看起来很奇怪。谁能告诉我为什么整数显示不正确?
主要
Packet packet = new Packet();
packet.builder.AddString(Constants.Requests.GET_RESOURCES);
packet.builder.AddString("Another_String");
packet.builder.AddInt(500);
byte[] byteArray = packet.builder.GetByteBuffer();
Console.WriteLine(ByteArrayToString(byteArray));
ByteArray Output: Get_Resources:Another_String:?☺:
47-65-74-5F-52-65-73-6F-75-72-63-65-73-00-3A-41-6E-6F-74-68-65-72-5F-53-74-72-69-6E-67-00-3A-F4-01-00-00-00-3A
如你所见:?☺绝对是错误的。功能都差不多
Class
class Packet
{
public Builder builder;
public Packet()
{
builder = new Builder();
}
private static string ByteArrayToString(byte[] arr)
{
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
return enc.GetString(arr);
}
public static string[] Read(byte[] _recievedData)
{
string data = ByteArrayToString(_recievedData).Trim();
string[] result = data.Split(':');
return result;
}
public class Builder
{
private byte[] buffer;
private int offset;
//Makes very easy on client to filter packets...
private byte[] seperator;
public Builder()
{
offset = 0;
buffer = new byte[4096];
seperator = BitConverter.GetBytes(':');
}
public void AddInt(int intValue)
{
byte[] byteArray = BitConverter.GetBytes(intValue);
for (int x = 0; x < byteArray.Length; x++)
{
buffer[x + offset] = byteArray[x];
}
for (int y = 0; y < seperator.Length; y++)
{
buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
}
offset += (byteArray.Length + seperator.Length);
}
public void AddString(string str)
{
byte[] byteArray = Encoding.ASCII.GetBytes(str);
for (int x = 0; x < byteArray.Length; x++)
{
buffer[x + offset] = byteArray[x];
}
for (int y = 0; y < seperator.Length; y++)
{
buffer[byteArray.Length + (y + 1) + offset] = seperator[y];
}
offset += (byteArray.Length + seperator.Length);
}
public byte[] GetByteBuffer()
{
return buffer;
}
public void Reset()
{
buffer = null;
offset = 0;
}
}
}
您的代码运行良好。可能这不是您想要的,但以下代码将 int 转换为 4 个字节,因为它是一个 32 位整数。
byte[] byteArray = BitConverter.GetBytes(intValue);
在输出的末尾,您会以小端格式 F4-01-00-00
看到这 4 个字节,因为十六进制的 500
是 0x01F4
。这解释了你为什么得到,你得到什么。
现在我假设您期望 500
而不是 ?☺
。以下代码应该会获取您想要的结果:
byte[] byteArray = BitConverter.GetBytes(intValue.ToString());
这将添加数字的字符串表示而不是二进制表示。基于return类型的Read
函数,似乎需要的是字符串表示。