如何将字节数组Byte []从小端转换为大端。
我正在考虑将这个程序移植到Mono,并且想知道最好的方法。任何帮助,将不胜感激。
编辑:我正在读取寡妇和单声道文件。
感谢。 鲍勃。
答案 0 :(得分:4)
除非您知道byte[]
中的内容,否则无法“将byte[]
转换为大端”。例如,2字节整数需要交换它们的两个字节,而4字节整数需要将它们的4个字节反转。如果数组只包含一个整数,则反转元素将起作用。如果不是,您将需要单独处理数组中包含的每个不同实体。
Mono.DataConvert是一个可以在这里提供帮助的库,如果您知道需要将数组的哪些段视为什么类型的数据类型。我强烈建议您查看这个图书馆;我在几个项目中使用它,它非常漂亮。它甚至被MIT许可并包含在一个源文件中,因此您可以直接将其编译为您正在构建的任何程序集。
答案 1 :(得分:2)
嗯,我觉得这里有问题。字节数组很少是固有的大端或小端。一个字节几乎总是以字节序独立。你可能想要的是纠正字节数组中包含的整数,字符等的字节顺序。
为了做到这一点,你必须首先确定构成所述整数,字符等的字节,然后翻转这些字节。简单地翻转/反转整个数组可能不起作用(除非整个数组代表一个整数,char等)。
使用Array.Reverse()方法的以下重载来执行您想要的操作...
public static void Reverse(
Array array,
int index,
int length
)
答案 2 :(得分:1)
就我而言,我需要将给定的密钥(已经是小端格式)转换为大端字符串。它比我想象的要容易,并且不需要移位字节。这是我用来测试它的一个简单的控制台应用程序:
class LoginPageObect {
let userNameTextField = XCUIApplication().textFields["UserName"]
let passwordTextField = XCUIApplication().textFields["Password"]
let loginButton = XCUIApplication().buttons["LOG IN"]
func loginUser(testcase: XCTestCase) {
testcase.waitForElementToAppear(userNameTextField)
testcase.waitForElementToAppear(passwordTextField)
userNameTextField.tap()
userNameTextField.clearText()
userNameTextField.typeText("Shahid")
passwordTextField.tap()
passwordTextField.clearText()
passwordTextField.typeText("xxxxx")
loginButton.tap()
}
}
class UserProfilePageObject {
let userNameCell = XCUIApplication().tables.cells.staticTexts["Shahid"]
func navigateToUserProfile(testcase: XCTestCase) {
let loginPage = LoginPageObect()
logingPage.loginUser(testCase)
testcase.waitForElementToAppear(userNameCell)
userNameCell.tap()
}
}
给定的示例在控制台中打印出来:
原键:B13E7455-9965-4841-172F-741A662880D4
Big-endian版本的密钥:55743eb165994148172f741a662880d4
你可以在这里找到一个工作小提琴:https://realm.io/docs/swift/latest/#configuring-the-default-realm
答案 3 :(得分:0)
您想要反转数组中的项目,还是字节本身的值?如果只是数组,那么您可以使用Array.Reverse()