C# 如何将int转换为字节数组';然后回来?
我需要通过网络流发送一个整数。问题是我只能发送字节。 这就是为什么我需要将整数拆分为四个字节,然后发送这些字节,然后在另一端将其转换回整数 现在我只需要C#中的这个。但是对于最后一个项目,我需要将四个字节转换为Lua中的int [编辑] 卢阿怎么样?试试看 BitConverter.GetBytes() 请记住,返回数组中字节的顺序取决于系统的endianness 编辑: 至于Lua部分,我不知道如何转换回去。您总是可以乘以16得到与按位移位4相同的功能。它并不漂亮,我可以想象有一些库或实现它的东西。同样,添加字节的顺序取决于endianness,因此您可能需要仔细阅读C# 如何将int转换为字节数组';然后回来?,c#,.net,lua,byte,C#,.net,Lua,Byte,我需要通过网络流发送一个整数。问题是我只能发送字节。 这就是为什么我需要将整数拆分为四个字节,然后发送这些字节,然后在另一端将其转换回整数 现在我只需要C#中的这个。但是对于最后一个项目,我需要将四个字节转换为Lua中的int [编辑] 卢阿怎么样?试试看 BitConverter.GetBytes() 请记住,返回数组中字节的顺序取决于系统的endianness 编辑: 至于Lua部分,我不知道如何转换回去。您总是可以乘以16得到与按位移位4相同的功能。它并不漂亮,我可以想象有一些库或实现它
也许您可以在C#?中转换回BinaryWriter/BinaryReader类将int转换为字节数组并显示:BitConverter www.java2s.com/Tutorial/CSharp/0280_uudevelopment/convertanintotoabytearrayanddisplay.htm 整数到字节-Visual Basic.NET答案 如何:将字节数组转换为整数(C#编程指南)
正如Nubsis所说,
位转换器
是合适的,但没有保证端性
我有一个EndianBitConverter
类,允许您指定endianness。当然,如果您只想对单个数据类型(int
)执行此操作,您可以手工编写代码
BinaryWriter
是另一个选项,这确实保证了很少的结尾。(同样,如果您需要其他选项,MiscUtil有一个EndianBinaryWriter
)位转换器是最简单的方法,但是如果您想要控制字节的顺序,您可以自己进行位移位
int foo = int.MaxValue;
byte lolo = (byte)(foo & 0xff);
byte hilo = (byte)((foo >> 8) & 0xff);
byte lohi = (byte)((foo >> 16) & 0xff);
byte hihi = (byte)(foo >> 24);
还有。。BitConverter的实现使用了不安全的和指针,但它又短又简单
public static unsafe byte[] GetBytes(int value)
{
byte[] buffer = new byte[4];
fixed (byte* numRef = buffer)
{
*((int*) numRef) = value;
}
return buffer;
}
转换为字节[]: BitConverter.GetBytes(int) 要转换回整数: 位转换器.ToInt32(字节数组,偏移量) 但我不确定Lua的情况 如果您担心endianness,请使用John Skeet的EndianBitConverter。我已经使用过它,它可以无缝工作 C#支持他们自己实施HTON和NTOH,具体如下:
但是它们只在有符号的int16,int32,int64上工作,这意味着你可能会做很多不必要的转换来让它们工作,如果你用最高阶位来做除整数签名以外的任何事情,你就完蛋了。曾经去过那里,做过那件事:tsk:::tsk::Microsoft没有在.NET中提供更好的尾数转换支持。这里是Lua中的一些函数,用于将32位2的补码转换为字节,并将4个字节转换为32位2的补码。可以/应该做更多的检查来验证传入参数是否有效
-- convert a 32-bit two's complement integer into a four bytes (network order)
function int_to_bytes(n)
if n > 2147483647 then error(n.." is too large",2) end
if n < -2147483648 then error(n.." is too small",2) end
-- adjust for 2's complement
n = (n < 0) and (4294967296 + n) or n
return (math.modf(n/16777216))%256, (math.modf(n/65536))%256, (math.modf(n/256))%256, n%256
end
-- convert bytes (network order) to a 32-bit two's complement integer
function bytes_to_int(b1, b2, b3, b4)
if not b4 then error("need four bytes to convert to int",2) end
local n = b1*16777216 + b2*65536 + b3*256 + b4
n = (n > 2147483647) and (n - 4294967296) or n
return n
end
print(int_to_bytes(256)) --> 0 0 1 0
print(int_to_bytes(-10)) --> 255 255 255 246
print(bytes_to_int(255,255,255,246)) --> -10
--将32位2的补码整数转换为4字节(网络顺序)
函数int_到_字节(n)
如果n>2147483647,则错误(n.“太大”,2)结束
如果n<-2147483648,则错误(n.“太小”,2)结束
--调整为2的补码
n=(n<0)和(4294967296+n)或n
返回(math.modf(n/16777216))%256,(math.modf(n/65536))%256,(math.modf(n/256))%256,n%256
结束
--将字节(网络顺序)转换为32位2的补码整数
函数字节_到_int(b1、b2、b3、b4)
如果不是b4,则错误(“需要四个字节转换为int”,2)结束
本地n=b1*16777216+b2*65536+b3*256+b4
n=(n>2147483647)和(n-4294967296)或n
返回n
结束
打印(整数到字节(256))-->0
打印(整数到字节(-10))-->255 246
打印(字节到整数(255255246))-->-10
有关Lua,请查看Roberto的图书馆。(Roberto是Lua的作者之一。)它比所讨论的具体情况更一般,但交换int
的需要很快就需要交换其他简单类型或更大的结构
假设两端的本机字节顺序都是可接受的(顺便说一句,这可能是一个错误的假设),那么您可以使用以下命令将数字转换为4字节整数:
buffer = struct.pack("l", value)
然后又回来了:
值=结构解包(“l”,缓冲区)
在这两种情况下,buffer
都是包含字节的Lua字符串。如果需要从Lua访问单个字节值,string.byte
是您的朋友
要指定压缩数据的字节顺序,请将big-endian的格式从“l”
更改为“l”
struct
模块是用C实现的,必须先编译成DLL或平台的等效文件,然后Lua才能使用它。这就是说,它包含在自带电池的安装软件包中,这是在Windows系统上安装Lua的一种流行方式。为Lua方面提出一个单独的(但相关的)问题,以便这些答案明显独立于C答案……这是一个很好的答案,尽管我个人从未遵循Lua风格(…和…)或作业。在这种情况下使用just if对我来说很好。我也更喜欢这种方法,因为BitConverter不重用现有数组(例如ref byte[]),而是总是创建一个新数组-我想这会在需要进行多次转换时影响性能。